Docker 概述
- 略
Docker 安装
- 官方安装文档
- https://docs.docker.com/engine/install/centos/
# 卸载
sudo yum remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
# 安装必备安装包
sudo yum install -y yum-utils
# 设置安装镜像,这里设置的是国外镜像,如果是国内可以搜索阿里云镜像
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker最新版本
sudo yum install docker-ce docker-ce-cli containerd.io
# 查看docker是否安装成功
docker --version
#启动docker
sudo systemctl start docker
#运行helloworld
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally 【本地不存在hello-world镜像】
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete 【去仓库拉去镜像】
Digest: sha256:5122f6204b6a3596e048758cabba3c46b1c937a46b5be6225b835d091b90e46c
Status: Downloaded newer image for hello-world:latest
Hello from Docker! 【出现表示运行成功】
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
- 卸载Docker
# 卸载docker 服务、客户端、容器等
sudo yum remove docker-ce docker-ce-cli containerd.io
# 删除镜像、自定义配置等
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
- Note如果想安装Docker特定版本参考如下
#查看docker 相关版本
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.6-3.el7 @docker-ce-stable
docker-ce.x86_64 3:20.10.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stable
#选择自建想要的版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
#如:
sudo yum install docker-ce-20.10.5 docker-ce-cli-20.10.5 containerd.io
安装错误排查
在Centos 7上安装时,有的时候会出现 == Requires: fuse-overlayfs >= 0.7 error while installing docker in RHEL-7.== 这样的错误。可以通过修改/etc/yum.repos.d/docker-ce.repo文件解决。
- 在/etc/yum.repos.d/docker-ce.repo文件头部加入如下内容
[centos-extras]
name=Centos extras - $basearch
baseurl=http://mirror.centos.org/centos/7/extras/x86_64
enabled=1
gpgcheck=0
- 然后在运行安装docker的命名
sudo yum install docker-ce docker-ce-cli containerd.io
参考:https://stackoverflow.com/questions/65878769/cannot-install-docker-in-a-rhel-server
Docker 常用命令
https://docs.docker.com/engine/reference/commandline
帮助命令
#查看版本
docker --version
#docker 系统信息
docker info
#帮助文档
docker --help
镜像命令
- 查看所有的镜像
#查看所有镜像,镜像名称、标签(版本)、IMAGE ID、镜像创建时间、大小
docker impages
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.34 2c9028880e58 35 hours ago 447MB
hello-world latest d1165f221234 2 months ago 13.3kB
#查看所有镜像
docker images -a
#只显示所有镜像的id
docker images -aq
#根据名字过滤镜像
# docker images mysql
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.34 2c9028880e58 35 hours ago 447MB
mysql latest c0cdc95609f1 35 hours ago 556MB
#根据名字和版本过滤镜像
docker images mysql:5.7.34
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7.34 2c9028880e58 35 hours ago 447MB
- 查看docker官方已经支持的镜像
-
通过官方文档搜索:
https://hub.docker.com/search?q=mysql&type=image -
通过命令搜索
#搜索mysql镜像
docker search mysql
拉取镜像
#拉取Mysql镜像,版本(tag)为5.7.34,如果不制定默认拉取latest版本
# docker pull name:[tag]
#下载最新版本mysql镜像
docker pull mysql
#下载5.7.34版本的镜像,这个版本必须在docker hub 中能够查询到
docker pull mysql:5.7.34
删除镜像
# 删除制定镜像id
docker rmi 镜像id
# 删除一堆指定镜像id
docker rmi id1 id2 id3
# 删除所有镜像, docker images -aq 表示查询出来的值作为参数传递
docker rmi $(docker images -aq)
容器命令
说明:我们有了镜像才可以启动容器,下面的例子是我们 跑一个centos的容器
- 下载 centos 镜像
docker pull centos
- 新建并启动容器
docker run [可选参数] image
#参数说明
--name="Name" 制定容器名字 tomcat01 tomcat02
-d 指定通过后台运行方式
-it 使用交互方式运行,进入容器查看内容
-p 制定容器端口 -p 8081:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (最常用方式)
-p 容器端口
容器端口
-P 指定大P,表示随机指定端口
- 测试
#启动一个centos容器,命名为mycentos02, it进入交互模式,centos:[tag,可选]指定镜像名称,并以 /bin/bash 进入一个终端
[root@vmnode01 ~ 21:10:05]$ docker run --name="mycentos02" -it centos:latest /bin/bash
#可以看见我们进入了mycentos02这个容器中,e2d5ff619c66为容器ID,已经不是我们的linux的交互界面了
[root@e2d5ff619c66 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@e2d5ff619c66 /]#
#通过exit 退出容器,容器并停止运行
exit
# 退出容器,但是容器继续运行
[root@vmnode01 ~ 21:17:24]$ docker run --name='centos03' -it centos /bin/bash
#进入交互模式洪,运行 Ctrl + p + q 退出但是容器继续运行
[root@b4e75224b6cc /] ctrl + p + q
[root@vmnode01 ~ 21:18:01]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4e75224b6cc centos "/bin/bash" 8 seconds ago Up 7 seconds centos03
16fe922eb7b7 centos "/bin/bash" 55 seconds ago Up 54 seconds busy_cannon
a3139f15e364 centos "/bin/" About a minute ago Created crazy_jepsen
e2d5ff619c66 centos:latest "/bin/bash" 7 minutes ago Exited (0) 3 minutes ago mycentos02
b0005ce61484 centos "/bin/bash" 8 minutes ago Exited (0) 8 minutes ago mycentos
# 退出后再进入容器
[root@vmnode01 ~ 21:33:08]$ docker exec -it b4e75224b6cc /bin/bash
[root@b4e75224b6cc /]#
- 查看容器状态
# 查看正在运行的容器
[root@vmnode01 ~ 21:14:19]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 查看所有容器包括退出的
[root@vmnode01 ~ 21:14:15]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2d5ff619c66 centos:latest "/bin/bash" 4 minutes ago Exited (0) 3 seconds ago mycentos02
b0005ce61484 centos "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago mycentos
# 查看所有容器,但是只显示ID
[root@vmnode01 ~ 21:16:24]$ docker ps -aq
e2d5ff619c66
b0005ce61484
- 删除容器
#删除指定容器id,加-f表示强制删除,否则只能删除已经停止运行的容器
docker rm 容器id
#删除所有已经停止运行的容器
docker rm $(docker ps -aq)
docker ps -a|xargs docker rm
#删除所有的容器, -f表示强制删除,包括正在运行容器
docker rm -f $(docker ps -aq)
docker ps -a|xargs docker rm -f
#查看容器
docker ps -a
- 启动停止容器
#通过 docker ps -a,查看容器的状态后,我们可以通过下面的指令启动、重启、停止、kill容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id
常用其他命令
- 后台启动容器
通过-d 后台运行的容器,里面一定要有常驻程序运行,否则程序自动退出
#通过-d后台启动centos容器,但是由于此容器没有一直运行的内容,所以起来后就直接退出了
[root@vmnode01 ~ 22:00:38]$ docker run --name="test_backrun_fail" -d centos
e23c7791b23033e3fde7332a3484f1f37641bc379983d26f69eae9f435bbb6a7
#查看起来后直接退出了
[root@vmnode01 ~ 22:01:02]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e23c7791b230 centos "/bin/bash" 5 seconds ago Exited (0) 4 seconds ago test_backrun_fail
#通过-d后台启动centos容器,同时要求在容器中运行一段死循环程序:每秒钟输出一段话,所以此容器哪怕后台运行也不会退出
[root@vmnode01 ~ 22:01:10]$ docker run --name="test_backrun_and_log_success" -d centos /bin/sh -c "while true;do echo 'test001'; sleep 1;done"
3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec
[root@vmnode01 ~ 22:01:45]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3902a1559361 centos "/bin/sh -c 'while t…" 3 seconds ago Up 2 seconds test_backrun_and_log_success
e23c7791b230 centos "/bin/bash" 47 seconds ago Exited (0) 46 seconds ago test_backrun_fail
- 查看容器中的日志
# 查看Logs命令帮助文档
[root@vmnode01 ~ 22:10:08]$ docker logs --help
[root@vmnode01 ~ 22:10:08]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3902a1559361 centos "/bin/sh -c 'while t…" 9 minutes ago Up 9 minutes test_backrun_and_log_success
e23c7791b230 centos "/bin/bash" 10 minutes ago Exited (0) 10 minutes ago test_backrun_fail
# -f 日志输出其实位置, --tail 5表示从最后5行日志显示, -t 表示显示时间,3902a1559361 为容器ID
[root@vmnode01 ~ 22:10:08]$ docker logs -f --tail 5 3902a1559361 -t
2021-05-13T21:09:21.349513027Z test001
2021-05-13T21:09:22.353165964Z test001
2021-05-13T21:09:23.355794199Z test001
2021-05-13T21:09:24.360486122Z test001
2021-05-13T21:09:25.363866000Z test001
2021-05-13T21:09:26.365902668Z test001
- 查看容器内的进程
#查看某个容器内的进程: docker top 容器ID
[root@vmnode01 ~ 22:15:58]$ docker top 3902a1559361
UID PID PPID C STIME TTY TIME CMD
root 21020 21000 0 22:01 ? 00:00:00 /bin/sh -c while true;do echo 'test001'; sleep 1;done
root 22042 21020 0 22:16 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
#查看某个容器的详细信息
# 查看帮助
[root@vmnode01 ~ 22:20:00]$ docker inspect --help
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
#查看某个容器的所有详细信息
[root@vmnode01 ~ 22:20:04]$ docker inspect 3902a1559361
[
{
"Id": "3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec",
"Created": "2021-05-13T21:01:45.449473154Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo 'test001'; sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 21020,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-05-13T21:01:45.713927086Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec/hostname",
"HostsPath": "/var/lib/docker/containers/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec/hosts",
"LogPath": "/var/lib/docker/containers/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec-json.log",
"Name": "/test_backrun_and_log_success",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/857f0b9d592c32786310503e1d02127d9e026dfeaa3adc467f0c6eeaaf1787a3-init/diff:/var/lib/docker/overlay2/9ad5435780592cf497f96d1486f741d4fd88e41a0121f9568bf7a1d5fc1731fe/diff",
"MergedDir": "/var/lib/docker/overlay2/857f0b9d592c32786310503e1d02127d9e026dfeaa3adc467f0c6eeaaf1787a3/merged",
"UpperDir": "/var/lib/docker/overlay2/857f0b9d592c32786310503e1d02127d9e026dfeaa3adc467f0c6eeaaf1787a3/diff",
"WorkDir": "/var/lib/docker/overlay2/857f0b9d592c32786310503e1d02127d9e026dfeaa3adc467f0c6eeaaf1787a3/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "3902a1559361",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/sh",
"-c",
"while true;do echo 'test001'; sleep 1;done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20201204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "c52d41e27b007a6e34e3c4be7d6be44f9d95cf1765e3b3018b844c23eb777aca",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/c52d41e27b00",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "3292c23f7a393725d652aed2c2430db1bc3a65ba9cba9ccf8727475b3774c023",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "51605dd1c778b5e0cef1715c4e67f86b55bf35724c1c942d81ec33ee799b4c4c",
"EndpointID": "3292c23f7a393725d652aed2c2430db1bc3a65ba9cba9ccf8727475b3774c023",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
#查看某个容器的部分详细信息,如日志路径
#docker inspect --format='{{.LogPath}}' $INSTANCE_ID
[root@vmnode01 ~ 22:23:40]$ docker inspect --format='{{.LogPath}}' 3902a1559361
/var/lib/docker/containers/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec/3902a1559361aebf2f3245cdfc2b1f773c7a70b4ede71413974595a4490dd4ec-json.log
#docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $INSTANCE_ID
- 进入正在运行的容器
#方式一:使用exec命令进入容器,-it表示以交互式的方式,进入后使用的命令/bin/bash 打开一个新的终端
#进入3902a1559361 容器
[root@vmnode01 ~ 22:25:26]$ docker exec -it 3902a1559361 /bin/bash
#以后的操作都是在容器内操作
[root@3902a1559361 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#查看容器中的所有进程
[root@3902a1559361 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 21:01 ? 00:00:00 /bin/sh -c while true;do echo 'test001'; sleep 1;done
root 1640 0 0 21:29 pts/0 00:00:00 /bin/bash
root 1684 1 0 21:29 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root 1685 1640 0 21:29 pts/0 00:00:00 ps -ef
#方式二: docker attach containerID
#方式二这种方式进入容器还是进入的容器当时启动时启动的终端是同一个终端
[root@vmnode01 ~ 22:45:23]$ docker attach 95bfc48fe649
[root@95bfc48fe649 ~]# ls
a.java anaconda-ks.cfg anaconda-post.log original-ks.cfg
- 从容器汇总拷贝文件到主机
#以交互式方式启动容器 centos_cp
[root@vmnode01 ~ 22:56:02]$ docker run -it --name="centos_cp" centos /bin/bash
[root@e28ea3f5ecce /]#
#容器内创建文件
[root@e28ea3f5ecce /]# pwd
/
[root@e28ea3f5ecce /]# cd /home
[root@e28ea3f5ecce home]# touch a.java b.java
[root@e28ea3f5ecce home]# ls
a.java b.java
#退出容器但是容器继续运行
ctrl + p + q
#将容器中的/home/a.java文件拷贝到主机 /root目录下
[root@vmnode01 ~ 22:59:20]$ docker cp e28ea3f5ecce:/home/a.java /root/
[root@vmnode01 ~ 22:59:27]$ ls
a.java anaconda-ks.cfg polysh polysh-0.4 polysh-0.4.tar.gz
#停止容器运行,容器停止运行后仍然可以拷贝容器中内容
[root@vmnode01 ~ 22:59:50]$ docker stop e28ea3f5ecce
e28ea3f5ecce
[root@vmnode01 ~ 23:00:01]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e28ea3f5ecce centos "/bin/bash" 3 minutes ago Exited (0) 4 seconds ago centos_cp
91c67707a906 centos "--name=centos_cp /b…" 4 minutes ago Created vigorous_carver
#将容器中的/home/b.java文件拷贝到主机 /root目录下
[root@vmnode01 ~ 23:00:06]$ docker cp e28ea3f5ecce:/home/b.java /root/
[root@vmnode01 ~ 23:00:18]$ ls
a.java anaconda-ks.cfg b.java polysh polysh-0.4 polysh-0.4.tar.gz
Docker 可视化
- portainer