Docker使用学习笔记

冯育
2023-12-01

教程地址:
https://www.runoob.com/docker/docker-tutorial.html
(另一个很好的教程):http://www.dockerinfo.net/document
镜像表示:

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。 如ubuntu:15.10

容器使用

  1. docker命令帮助

    docker # 查看全部命令
    docker command --help # 查看command使用详情
    
  2. 新建容器

    docker run ubuntu:15.10 /bin/echo "Hello world"
    

    各个参数解析:

    • docker: Docker 的二进制执行文件。
    • run: 与前面的 docker 组合来运行一个容器。
    • ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
    • /bin/echo “Hello world”: 在启动的容器里执行的命令

    当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:

     - 检查本地是否存在指定的镜像,不存在就从公有仓库下载
     - 利用镜像创建并启动一个容器
     - 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
     - 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
     - 从地址池配置一个 ip 地址给容器
     - 执行用户指定的应用程序
     - 执行完毕后容器被终止
    
  3. 新建交互式的容器

    docker run -i -t --name runtest  ubuntu:15.10 /bin/bash
    

    各个参数解析:

    • -t: 在新容器内指定一个伪终端或终端。
    • -i: 允许你对容器内的标准输入 (STDIN) 进行交互。
    • –name 指定容器名
  4. 通过运行 exit 命令或者使用 CTRL+D 来退出容器

  5. 启动容器(后台模式)

    docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
    docker run -itd --name ubuntu-test ubuntu /bin/bash # 交互式后台运行
    
  6. 查看容器

    docker ps # 查看正在运行容器
    docker ps -l # 查看最新一个创建的容器
    docker ps -a # 查看所有容器
    

    输出详情介绍:

    • CONTAINER ID: 容器 ID。
    • IMAGE: 使用的镜像。
    • COMMAND: 启动容器时运行的命令。
    • REATED: 容器的创建时间。
    • STATUS: 容器状态。
    • 状态有7种:
      • created(已创建)
      • restarting(重启中)
      • running 或 Up(运行中)
      • removing(迁移中)
      • paused(暂停)
      • exited(停止)
      • dead(死亡)
    • PORTS: 容器的端口信息和使用的连接类型(tcp\udp)。
    • NAMES: 自动分配的容器名称。

    也可以使用 docker inspect 来查看容器的名字

    docker inspect -f "{{ .Name }}" aed84ee21bde
    >>/web
    
  7. 查看容器内的标准输出

    docker logs 容器名/容器id 
    docker logs -f 容器名/容器id
    
    • -f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
  8. 容器使用(非新建)

    docker start 容器名/容器id  # 启用容器 
    docker stop  容器名/容器id  # 停止容器
    docker restart  容器名/容器id  # 重启容器
    
    docker start ... 包含容器文件系统挂载的操作
    docker stop ... 包含容器文件系统卸载的操作
    docker restart ... 不包含容器文件系统的卸载与挂载操作,本质上docker restart不涉及文件系统的操作,因此restart命令并不是stop与start两个命令的顺序叠加。
    
    但为了保证容器的根文件系统与内存系统mount的正确性,推荐对一个容器的重启使用docker stop xxx
    
    然后 docker start xxx,而非docker restart xxx。
    
  9. 进入容器

    # 使用-d启动容器后,容器会在后台运行,要想进入,可使用以下两个方式
    docker attach 容器名/容器id # exit后,会停止容器,同时当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
    docker exec -it 容器名/容器id /bin/bash #推荐,exit后,不会停止容器
    
  10. 删除容器

     docker rm -f 容器名/容器id  # 强制删除,即使容器在运行
    
  11. 容器更新

    # 某个使用相同镜像的容器,新安装了iputils-ping,然后提交到了镜像中
    # 另一个使用相同的容器,则可如下更新后安装
    apt-get update
    apt install iputils-ping 
    
  12. 指定端口
    https://www.runoob.com/docker/docker-container-connection.html

    docker run -d -P training/webapp python app.py # 随机端口
    docker run -d -p 5000:5000 training/webapp python app.py # 指定端口
    docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py # 绑定网络ip,访问127.0.0.1:5001则可访问容器5000端口
    docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py # /udp绑定容器udp端口 ,127.0.0.1:5000->5000/udp
    docker port 容器名/容器id # 查看容器端口映射,如返回 5000/tcp -> 0.0.0.0:5000
    
    • -P:将容器内部使用的网络端口随机映射到我们使用的主机上。 通过docker ps 的Ports查看映射关系,如0.0.0.0:32769->5000/tcp,即把宿主机的32769映射到容器的5000端口,可通过浏览器登录 宿主机ip:32769登录。
  13. 检查容器

    docker top 容器名/容器id  # 查看容器内部运行的进程
    docker inspect 容器名/容器id  # 查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
    

镜像使用

  1. 列出镜像列表

     docker images
    
    • REPOSITORY:表示镜像的仓库源

    • TAG:镜像的标签

    • IMAGE ID:镜像ID

    • CREATED:镜像创建时间

    • SIZE:镜像大小

  2. 查找镜像

    docker search 镜像名
    
    • NAME: 镜像仓库源的名称
    • DESCRIPTION: 镜像的描述
    • OFFICIAL: 是否 docker 官方发布
    • stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
    • AUTOMATED: 自动构建。
  3. 拉取镜像

     docker pull 镜像名 # 默认拉取最新版本,
     docker pull 镜像名:版本号 # 拉取指定版本
    
  4. 删除镜像

     docker rmi 镜像名(或镜像名:版本号)
    
  5. 设置镜像标签

    docker tag 860c279d2fec runoob/centos:dev
    # docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。
    

容器互联

  1. docker network create -d bridge test-net 方案: https://www.runoob.com/docker/docker-container-connection.html
  2. link方案: http://www.dockerinfo.net/%e4%bd%bf%e7%94%a8%e7%bd%91%e7%bb%9c
  3. docker compose 方案

配置DNS

全量配置

可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS:

{
  "dns" : [
    "114.114.114.114",
    "8.8.8.8"
  ]
}

设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。

配置完,需要重启 docker 才能生效。
查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息:

$ docker run -it --rm  ubuntu  cat etc/resolv.conf
  • –rm:容器退出时自动清理容器内部的文件系统。

指定容器配置

docker run -it --rm -h host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu
  • –rm:容器退出时自动清理容器内部的文件系统。

  • -h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

  • –dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

  • –dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。

数据卷和数据卷容器

http://www.dockerinfo.net/%e6%95%b0%e6%8d%ae%e5%8d%b7volumes
https://www.cnblogs.com/wade-luffy/p/6542539.html

生产环境中使用Docker的过程中,往往需要对数据进行持久化(挂载一个主机目录作为数据卷方式),或者需要在多个容器之间进行数据共享(数据卷容器),这必然涉及容器的数据管理操作。

其实,不挂载主机目录,仅用 -v /path的容器,就是数据卷容器

Docker Dockerfile

修改已有镜像

先使用下载的镜像启动容器。

$ sudo docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#

注意:记住容器的 ID,稍后还会用到。

在容器中添加 json 和 gem 两个应用。

root@0b2616b0e5a8:/# gem install json

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。

$ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

使用 docker images 来查看新创建的镜像。

$ sudo docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 MB

之后,可以使用新的镜像来启动容器

$ sudo docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

利用 Dockerfile 来创建镜像

总结的好,不用精简:https://www.runoob.com/docker/docker-dockerfile.html

补充:http://www.dockerinfo.net/image%e9%95%9c%e5%83%8f

Docker Compose

 类似资料: