Docker镜像使用

列出镜像列表、获取一个新的镜像

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小
  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
# docker images = docker image ls 来列出本地主机上的镜像
[root@docker ~]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
test/ubuntu       v1        f6d588cc74ff   5 days ago      72.8MB
ubuntu            latest    ba6acccedd29   17 months ago   72.8MB
training/webapp   latest    6fae60ef3446   7 years ago     349MB
# 同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、14.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
[root@docker ~]# docker run -it ubuntu:15.10 /bin/bash
# 当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
[root@docker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

查找、拖取、删除(镜像)

# docker search 命令来搜索镜像
[root@docker ~]# docker search centos
[root@docker ~]# docker pull centos
#下载完成后,我们就可以使用这个镜像了
[root@docker ~]# docker run centos
[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND           CREATED             STATUS                         PORTS                                                 NAMES
7e99c0b85960   centos            "/bin/bash"       13 seconds ago      Exited (0) 12 seconds ago                                                            friendly_raman
# 镜像删除使用 docker rmi 命令
[root@docker ~]# docker rmi centos:latest 
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59

设置镜像标签

# 使用 docker tag 命令,为镜像添加一个新的标签
[root@docker ~]# docker tag ba ubuntu:lpm
[root@docker ~]# docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
test/ubuntu       v1        f6d588cc74ff   5 days ago      72.8MB
ubuntu            latest    ba6acccedd29   17 months ago   72.8MB
ubuntu            lpm       ba6acccedd29   17 months ago   72.8MB

Docker容器连接

网络端口映射

# 创建了一个 python 应用的容器
[root@docker ~]# docker run -d -P training/webapp python app.py
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED              STATUS              PORTS                                         NAMES
6f4f264ed148   training/webapp   "python app.py"   About a minute ago   Up About a minute   0.0.0.0:32768->5000/tcp, :::32768->5000/tcp   thirsty_hamilton
# 使用 -P 绑定端口号,可以看到容器端口 5000 绑定主机端口 32768
[root@docker ~]# docker run -d -p 5000:5000 training/webapp python app.py
1214face3960028e1517c818141473b32d6b583a4f39a87f8e692bf7adb77685
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                         NAMES
1214face3960   training/webapp   "python app.py"   5 seconds ago   Up 4 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     sweet_mclean
6f4f264ed148   training/webapp   "python app.py"   3 minutes ago   Up 3 minutes   0.0.0.0:32768->5000/tcp, :::32768->5000/tcp   thirsty_hamilton
# 指定容器绑定的网络地址,比如绑定 127.0.0.1
[root@docker ~]# docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
e9e411418d185945c8ec3498c6c5c07707f7d8c22f4147fa01536486563e63b0
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS         PORTS                                         NAMES
e9e411418d18   training/webapp   "python app.py"   8 seconds ago   Up 6 seconds   127.0.0.1:5001->5000/tcp                      zen_matsumoto
1214face3960   training/webapp   "python app.py"   2 minutes ago   Up 2 minutes   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     sweet_mclean
6f4f264ed148   training/webapp   "python app.py"   6 minutes ago   Up 6 minutes   0.0.0.0:32768->5000/tcp, :::32768->5000/tcp   thirsty_hamilton
# 如果要绑定 UDP 端口,可以在端口后面加上 /udp
[root@docker ~]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
6fb648457d9aa2a31be5da378c5d1195191bdee677ce5e69e45413c98972a615
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED         STATUS              PORTS                                         NAMES
6fb648457d9a   training/webapp   "python app.py"   6 seconds ago   Up 5 seconds        5000/tcp, 127.0.0.1:5000->5000/udp            vigilant_spence
e9e411418d18   training/webapp   "python app.py"   2 minutes ago   Up About a minute   127.0.0.1:5001->5000/tcp                      zen_matsumoto
1214face3960   training/webapp   "python app.py"   4 minutes ago   Up 4 minutes        0.0.0.0:5000->5000/tcp, :::5000->5000/tcp     sweet_mclean
6f4f264ed148   training/webapp   "python app.py"   8 minutes ago   Up 8 minutes        0.0.0.0:32768->5000/tcp, :::32768->5000/tcp   thirsty_hamilton
# docker port 命令可以让我们快捷地查看端口的绑定情况
[root@docker ~]# docker port thirsty_hamilton
5000/tcp -> 0.0.0.0:32768
5000/tcp -> [::]:32768

Docker容器互联

​ 端口映射并不是唯一把 docker 连接到另一个容器的方法。docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。

# 容器命名: 当我们创建一个容器的时候,docker 会自动对它进行命名。我们也可以使用 --name 标识来命名容器
[root@docker ~]# docker run -d -P --name lpm training/webapp python app.py
c503e43f7a92310905fb240d35b5eeb8290079a0e79c3292b65fa15ce70e2a23
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED          STATUS          PORTS                                         NAMES
c503e43f7a92   training/webapp   "python app.py"   3 seconds ago    Up 3 seconds    0.0.0.0:32769->5000/tcp, :::32769->5000/tcp   lpm
# 新建网络: 创建一个新的 Docker 网络
-d:参数指定 Docker 网络类型,有 bridge、overlay
[root@docker ~]# docker network create -d bridge test-net
aa3ab21bd553e6c3b523106a7315003e4e4f8dfe755ba3e776c62e0ecc7debf2
[root@docker ~]# docker network ls 
NETWORK ID     NAME       DRIVER    SCOPE
6cd219b77df5   bridge     bridge    local
eb9f7b4bf18e   host       host      local
ddc55f5f1a65   none       null      local
aa3ab21bd553   test-net   bridge    local
# 连接容器: 运行两个容器并连接到新建的 test-net 网络
[root@docker ~]# docker run -itd --name test1 --network test-net ubuntu /bin/bash
2f59a8b8058a8722d83d26a3e8e8ea99e6235bc5bd28b266232f87255083b4b6
[root@docker ~]# docker run -itd --name test2 --network test-net ubuntu /bin/bash
2ee37eda451952ad77d19043a43d568cc1ec79f76dc353bd846f79c7271144f8
[root@docker ~]# docker ps
CONTAINER ID   IMAGE             COMMAND           CREATED              STATUS              PORTS                                         NAMES
2ee37eda4519   ubuntu            "/bin/bash"       33 seconds ago       Up 32 seconds                                                     test2
2f59a8b8058a   ubuntu            "/bin/bash"       About a minute ago   Up About a minute       
# 通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。如果 test1、test2 容器内中无 ping 命令,则在容器内执行以下命令安装 ping
apt-get update
apt install iputils-ping
root@2f59a8b8058a:/# ping test2
PING test2 (172.18.0.3) 56(84) bytes of data.
64 bytes from test2.test-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.081 ms
64 bytes from test2.test-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.093 ms
root@2ee37eda4519:/# ping test1
PING test1 (172.18.0.2) 56(84) bytes of data.
64 bytes from test1.test-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.054 ms
64 bytes from test1.test-net (172.18.0.2): icmp_seq=2 ttl=64 time=0.096 ms

配置DNS

# 可以在宿主机的 /etc/docker/daemon.json 文件中增加以下内容来设置全部容器的 DNS
[root@docker ~]# cat /etc/docker/daemon.json 
{
"registry-mirrors":["https://59b5ruz2.mirror.aliyuncs.com"]

}
{
   "dns" : [
      "114.114.114.114",
      "8.8.8.8"
]
}
# 设置后,启动容器的 DNS 会自动配置为 114.114.114.114 和 8.8.8.8。配置完,需要重启 docker 才能生效。查看容器的 DNS 是否生效可以使用以下命令,它会输出容器的 DNS 信息
[root@docker ~]# docker run -it --rm  ubuntu  cat etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114