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