docker安装
1.卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.需要的安装包
yum install -y yum-utils
3.设置镜像的仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.安装docker相关的内容
yum install docker-ce docker-ce-cli containerd.io -y
docker-ce 社区版 docker-ee 企业版
5.启动docker
systemctl start docker
docker version (验证)
docker run hello-world
6.查看hello是否存在
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 9 months ago 13.3kB
[root@localhost ~]#
7.卸载docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
8.配置阿里云镜像加速
(1) 安装/升级Docker客户端
推荐安装1.10.0以上版本的Docker客户端,参考文档docker-ce
(2)配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json
来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://o1s7l77v.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
————————————————————
docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息 ,包括镜像和容器的数量
docker <命令> --help #帮助命令
镜像命令
docker images 查看所有本地的主机上的镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 9 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a #列出所有镜像
-q #只显示镜像的ID
docker search 搜索镜像
[root@localhost ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10081 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3694 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 737
#可选项,通过搜索来过滤
--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的
[root@localhost ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10081 [OK]
mariadb MariaDB is a community-developed fork of MyS… 3694 [OK]
[root@localhost ~]# docker search mysql --filter=STARS=5000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10081 [OK]
docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag]
[root@localhost ~]# docker pull mysql
Using default tag: latest # 如果不写 tag,默认就是 latest
latest: Pulling from library/mysql
bb79b6b2107f: Pull complete # 分层下载, docker images的核心 联合文件系统
49e22f6fb9f7: Pull complete
842b1255668c: Pull complete
9f48d1f43000: Pull complete
c693f0615bce: Pull complete
8a621b9dbed2: Pull complete
0807d32aef13: Pull complete
9eb4355ba450: Pull complete
6879faad3b6c: Pull complete
164ef92f3887: Pull complete
6e4a6e666228: Pull complete
d45dea7731ad: Pull complete
Digest: sha256:86b7c83e24c824163927db1016d5ab153a9a04358951be8b236171286e3289a4
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址
#等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
docker rmi 删除镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 8e85dd5c3255 6 days ago 544MB
hello-world latest bf756fb1ae65 9 months ago 13.3kB
[root@localhost ~]# docker rmi -f 容器ID #删除指定的容器
[root@localhost ~]# docker rmi -f 容器ID 容器ID 容器ID #删除多个容器
[root@localhost ~]# docker rmi -f $(docker images -aq) #删除全部的容器
容器命令
我们有了镜像才可以创建容器
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字 Tomcat01 Tomcat02,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-p 随机指定端口
#测试,启动并进入容器
[root@localhost ~]# docker run -it centos /bin/bash
[root@edc0e8841191 /]# ls # 查看容器内的centos,基础版本,很多命令都是不完善的
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
#从容器中退回主机
[root@edc0e8841191 /]# exit
exit
docker ps 列出所有的运行的容器
# docker ps 命令
# 列出当前正在运行的容器
-a # 列出当前正在运行的容器 + 带出历史运行过得容器
-n=? # 列出最近创建的容器
-q # 只显示容器的编号
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa594b9a85e2 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago elastic_dubinsky
edc0e8841191 centos "/bin/bash" 7 minutes ago Exited (0) 6 minutes ago vigilant_morse
24269038ee89 centos "/bin/bash" 9 minutes ago Exited (0) 9 minutes ago clever_chaum
5f4df578418f hello-world "/hello" 2 hours ago Exited (0) 2 hours ago compassionate_bose
[root@localhost /]# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa594b9a85e2 centos "/bin/bash" 5 minutes ago Exited (0) 5 minutes ago elastic_dubinsky
[root@localhost /]# docker ps -aq
fa594b9a85e2
edc0e8841191
24269038ee89
5f4df578418f
退出容器
exit # 直接容器停止并退出
ctrl + P + Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq) # 删除所有的容器
docker ps -a -q|xargs rm # 删除所有的容器
启动和停止容器的操作
docker start 容器ID # 启动容器
docker restart 容器ID # 重启容器
docker stop 容器ID # 停止当前正在运行的容器
docker kill 容器ID # 强制停止当前容器
容器其他命令
# 命令 docker run -d 镜像名:
[root@localhost /]# docker run -d centos
# 问题docker ps 发现 centos 停止了
# 常见问题: docker容器使用后来运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# Nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker log -f -t --tail 容器ID
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
016539f89a1b centos "/bin/bash" 2 minutes ago Up 2 minutes ecstatic_tereshkova
[root@localhost /]# docker logs -f -t --tail 5 016539f89a1b
2020-10-19T15:18:06.644323647Z [root@016539f89a1b ~]# cd
2020-10-19T15:18:08.078316135Z [root@016539f89a1b ~]# cd /
2020-10-19T15:18:09.319640646Z [root@016539f89a1b /]# cd/
2020-10-19T15:18:09.319662081Z bash: cd/: No such file or directory
2020-10-19T15:18:10.511815225Z [root@016539f89a1b /]# cd /
# 显示日志
-tf #显示日志
--tail number # 显示日志的条数
查看容器中的进程命令
# 命令 docker top 容器id
[root@localhost /]# docker top 016539f89a1b
UID PID PPID C STIME TTY TIME CMD
root 17644 17628 0 23:17 pts/0 00:00:00 /bin/bash
查看镜像的元数据
# 命令
docker inspect 容器ID
# 测试
[root@localhost /]# docker inspect 016539f89a1b
[
{
"Id": "016539f89a1bd18d9efca04009f469a88b8ee46ea12431386e63c7eb6e0c3ec9",
"Created": "2020-10-19T15:17:55.233092094Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 17644,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-10-19T15:17:55.946715347Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
"ResolvConfPath": "/var/lib/docker/containers/016539f89a1bd18d9efca04009f469a88b8ee46ea12431386e63c7eb6e0c3ec9/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/016539f89a1bd18d9efca04009f469a88b8ee46ea12431386e63c7eb6e0c3ec9/hostname",
"HostsPath": "/var/lib/docker/containers/016539f89a1bd18d9efca04009f469a88b8ee46ea12431386e63c7eb6e0c3ec9/hosts",
"LogPath": "/var/lib/docker/containers/016539f89a1bd18d9efca04009f469a88b8ee46ea12431386e63c7eb6e0c3ec9/016539f89a1bd18d9efca04009f469a88b8ee46ea12431386e63c7eb6e0c3ec9-json.log",
"Name": "/ecstatic_tereshkova",
"RestartCount": 0,
"Driver": "devicemapper",
"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,
"Capabilities": null,
"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": {
"DeviceId": "37",
"DeviceName": "docker-253:0-134359187-4653453f344d262b3c46fd50109d8bb4dcbabdd8bfeb63a26ea7dc923f138656",
"DeviceSize": "10737418240"
},
"Name": "devicemapper"
},
"Mounts": [],
"Config": {
"Hostname": "016539f89a1b",
"Domainname": "",
"User": "",
"AttachStdin": true,
"AttachStdout": true,
"AttachStderr": true,
"Tty": true,
"OpenStdin": true,
"StdinOnce": true,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/bash"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20200809",
"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": "9b10256f4881019e59d48e7da95a9b83aadf3e500e392adac7d3699f35e368ef",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/9b10256f4881",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "eb16249d25e462d7bc8b7f2131705b01a116d0975ee387d9f6b2fd524fb4c4c2",
"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": "e7d9d4065305282673eb0e0760f63a6f72aec72751b03c4d58b1c0d02a1624c2",
"EndpointID": "eb16249d25e462d7bc8b7f2131705b01a116d0975ee387d9f6b2fd524fb4c4c2",
"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 exec -it 容器ID bashshell
# 测试
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
016539f89a1b centos "/bin/bash" 12 minutes ago Up 12 minutes ecstatic_tereshkova
[root@localhost /]# docker exec -it 016539f89a1b bin/bash
[root@016539f89a1b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 方式二
docker attach 容器ID
# docker exec # 进入容器后开启一个新的终端,可以在里面操作 (常用)
# docker attach # 进入容器正在执行的终端,不会启动新的进程
从容器内拷贝文件到主机上
docker cp 容器ID:容器内路径 目的主机路径
# 进入容器内部
[root@localhost home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 8e85dd5c3255 6 days ago 544MB
centos latest 0d120b6ccaa8 2 months ago 215MB
hello-world latest bf756fb1ae65 9 months ago 13.3kB
[root@localhost home]# docker run -it centos /bin/bash
# 在容器内创建一个文件
[root@393c755a6773 /]# cd /home/
[root@393c755a6773 home]# ls
[root@393c755a6773 home]# touch lcx.txt
[root@393c755a6773 home]# ls
lcx.txt
[root@393c755a6773 home]# exit
exit
[root@localhost home]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
393c755a6773 centos "/bin/bash" 31 seconds ago Exited (0) 15 seconds ago gallant_gagarin
# 将这个文件拷贝出来到这个主机上
[root@localhost home]# docker cp 393c755a6773:/home/lcx.txt /home
[root@localhost home]# ls
lcx.txt
#拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现
作业练习
docker 安装Nginx
# 1.搜索镜像 search 建议去docker搜索,可以看到帮助文档和信息
# 2.下载镜像 pull
commit 镜像
docker commit 提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器ID 目标镜像名p[:tag]
实战测试
# 启动一个默认的tomcat
# 发现这个磨人的Tomcat是没有webapps应用,镜像的原因,官方的镜像默认 webapps下面是没有文件的
# 自己拷贝进去了基本的文件
# 将我们修改过的容器通过 commit提交为一个镜像
[root@localhost ~]# docker commit -a="lcx" -m="add webapps" e26fd234d529 tomcat05:1.0
sha256:ee915590b91eaca9cb596e915ea0ea2f533dd444951fb8a58a0e3179c24c2ced
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat05 1.0 ee915590b91e 10 seconds ago 652MB
mysql 5.7 2836a03e922f 15 minutes ago 448MB
tomcat 9.0 891fcd9c5b3a 6 days ago 647MB
Docker提交运行时容器成为镜像
docker commit -a=‘作者’ -m=‘备注’ 运行时容器ID 新镜像名称
例如:
docker commit -a='署名' -m='测试' ID 名称
如何查看容器的占用空间大小?
步骤1:先确认容器文件的默认路径
df -h
快速获取硬盘被占用了多少空间,目前还剩下多少空间等信息
默认情况下为 /var/lib/docker/containers
步骤2:查看所有容器的大小
du -sh *
[Docker 为运行中容器映射端口]
1、获得容器IP
将container_name 换成实际环境中的容器名
-
docker inspect --format={{'.NetworkSettings.IPAddress'}} container_name
2、 iptable转发端口
将容器的8000端口映射到Docker主机的8001端口
-
iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000
Docker查看容器IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名
查看采集容器日志
docker attach --sig-proxy=false 容器ID
如何根据进程pid查看该进程所属的容器
docker ps -q | xargs docker inspect --format '{{.State.Pid}}, {{.Name}}' | grep "PID"