Docker
Docker 常用命令
Docker镜像命令
docker images 查看本地上的所有镜像
[root@localhost xiaoxie]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 8 months ago 13.3kB
centos latest 5d0da3dc9764 2 years ago 231MB
# REPOSITORY 仓库源
# TAG 版本号
# IMAGE ID 镜像id
# CREATED 镜像创建时间
# SIZE 镜像大小
# 命令参数
[root@localhost xiaoxie]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
Options:
-a, --all # 显示所有镜像(常用)
-f, --filter filter # 对结果进行筛选
-q, --quiet # 只显示镜像id(常用)
[root@localhost xiaoxie]# docker images -aq
d2c94e258dcb
5d0da3dc9764
docker search 搜索Hub上的镜像
[root@localhost xiaoxie]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL
mysql MySQL is a widely used, open-source relation… 14788 [OK]
mariadb MariaDB Server is a high performing open sou… 5640 [OK]
percona Percona Server is a fork of the MySQL relati… 624 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 930 [OK]
bitnami/mysql Bitnami MySQL Docker Image 106
bitnami/mysqld-exporter 6
cimg/mysql 3
ubuntu/mysql MySQL open source fast, stable, multi-thread… 57
rapidfort/mysql RapidFort optimized, hardened image for MySQL 25
rapidfort/mysql8-ib RapidFort optimized, hardened image for MySQ… 9
google/mysql MySQL server for Google Compute Engine 25
rapidfort/mysql-official RapidFort optimized, hardened image for MySQ… 9
elestio/mysql Mysql, verified and packaged by Elestio 0
# 命令参数
[root@localhost xiaoxie]# docker search --help
Usage: docker search [OPTIONS] TERM
Options:
-f, --filter filter # 通过筛选搜索 e.g:--filter=STARS=3000 或者 -f=STARS=3000
[root@localhost xiaoxie]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL
mysql MySQL is a widely used, open-source relation… 14788 [OK]
mariadb MariaDB Server is a high performing open sou… 5640 [OK]
docker pull 拉取Hub中的镜像
[root@localhost xiaoxie]# docker pull mysql
Using default tag: latest # 如果不指定版本号 默认latest
latest: Pulling from library/mysql
558b7d69a2e5: Pull complete # 分层下载,docker image的核心,联合文件系统
2cb5a921059e: Pull complete
b85878fb9bb2: Pull complete
d16f3fd26a82: Pull complete
afd51b5329cb: Pull complete
374d2f7f3267: Pull complete
4ea1bb2c9574: Pull complete
1c9054053605: Pull complete
d79cd2da03be: Pull complete
e3a1aa788d17: Pull complete
Digest: sha256:d7c20c5ba268c558f4fac62977f8c7125bde0630ff8946b08dde44135ef40df3 #签名 防伪标志
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
# docker pull mysql 相当于 docker pull docker.io/library/mysql:latest
# 下载指定版本
[root@localhost xiaoxie]# docker pull mysql:5.7
5.7: Pulling from library/mysql
20e4dcae4c69: Pull complete # 如果该文件already exits,那么就不需要重复下载,极大节省空间
1c56c3d4ce74: Pull complete
e9f03a1c24ce: Pull complete
68c3898c2015: Pull complete
6b95a940e7b6: Pull complete
90986bb8de6e: Pull complete
ae71319cb779: Pull complete
ffc89e9dfd88: Pull complete
43d05e938198: Pull complete
064b2d298fba: Pull complete
df9a4d85569b: Pull complete
Digest: sha256:4bc6bc963e6d8443453676cae56536f4b8156d78bae03c0145cbe47c2aad73bb
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
docker rmi 删除镜像
[root@localhost xiaoxie]# docker rmi -f d404d78aa797
Untagged: mysql:5.5
Untagged: mysql@sha256:12da85ab88aedfdf39455872fb044f607c32fdc233cd59f1d26769fbf439b045
Deleted: sha256:d404d78aa797c87c255e5ae2beb5d8d0e4d095f930b1f20dc208eaa957477b74
Deleted: sha256:8ae7b3986b745c9cea4ea3789277dbf8543d6caed82c23d1ec19637813376df5
Deleted: sha256:6aaf52074d0d6ec3263af5f53b921a91ba3ddbeb2fece1a82ebe1bc5086c3814
Deleted: sha256:cf0a74866630c5d7ed05927cf981ac93b63ba83407872c9c0fbe0486d5f9806e
Deleted: sha256:e06cee897f9eb6bb5769f93cf6cd0285bb773d7e2bad6dfd5592a8682a6e6740
Deleted: sha256:4354e03e5a414adc57def51226d72fa2d117875a6c9665561a7c0fc85d23c46f
Deleted: sha256:647b973285178c7d4bf022c31baac404e0947d37be8e8e85731de8f7ca7e70e6
Deleted: sha256:c75ab456a585af40ca2ec8488164230deb81a1739d868604cb7b6661c24e37b5
Deleted: sha256:50a75eb6a0b2254fe5d96f999cc2087e72d515c93509a816bbd9ffb707a3b1b0
Deleted: sha256:1ae6616333a66450738a72a75c03bdf0236e0425ba0336ac5cdbe470ab6f4a3e
Deleted: sha256:68e318bd9263aedd19d9d73b051a262fa57e2a16f9c81c8b39163601020cd405
Deleted: sha256:6270adb5794c6987109e54af00ab456977c5d5cc6f1bc52c1ce58d32ec0f15f4
# 删除所有镜像
[root@localhost xiaoxie]# docker rmi -f $(docker images -aq)
Untagged: hello-world:latest
Untagged: hello-world@sha256:4bd78111b6914a99dbc560e6a20eab57ff6655aea4a80c50b0c5491968cbc2e6
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
Docker容器命令
说明:有了镜像之后,才可以创建容器,我们下载centos镜像来进行测试
dockers run 创建一个容器并启动
[root@localhost xiaoxie]# docker run --help
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Options:
--name="Name" # 指定容器名称
-d # 以后台方式运行
-it # 以交互方式运行,进入容器查看内容
-p # 指定容器端口,端口映射
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
-P # 随机指定端口
# 测试,启动并进入
[root@localhost xiaoxie]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 years ago 231MB
[root@localhost xiaoxie]# docker run -it 5d0 /bin/bash # /bin/bash 指定shell命令
[root@bd8b7ec2aa7b /]# ls # 查看容器内部的centos,与外面无关,是基础版本,很多命令不完整
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@bd8b7ec2aa7b /]# exit # 退出并停止运行容器 若只退出不停止-->ctrl+q+p
exit
[root@localhost xiaoxie]#
docker ps 查看当前正在运行的容器
[root@localhost xiaoxie]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# CONTAINER ID 容器id
# IMAGW 镜像名称
# CONMMAND 容器执行的命令
# CREATED 创建时间
# STATUS 启动时间
# PORTS 端口
# NAMES 容器名称
[root@localhost xiaoxie]# docker ps --help
Usage: docker ps [OPTIONS]
Options:
-a, --all # 显示所有的容器
-n, --last int # 显示最近启动的int个容器
-q, --quiet # 只显示容器id
exit 退出容器
[root@bd8b7ec2aa7b /]# exit # 直接退出并停止容器
ctrl+q+p # 仅退出容器
docker rm 删除容器
[root@localhost xiaoxie]# docker rm --help
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Options:
-f, --force # 强制删除,否则不能删除正在运行的容器
-v, --volumes # 删除与容器关联的匿名卷
# 删除所有容器
# 1、
[root@localhost xiaoxie]# docker rm -f $(docker ps -aq)
5e97bd05706d
957b11bdcd8d
bd8b7ec2aa7b
cdbaaab75753
# 2、
[root@localhost xiaoxie]# docker ps -aq|xargs docker rm -f
7de08079b439
启动与停止容器
docker start CONTAINER ID # 启动容器
docker restart CONTAINER ID # 重新启动容器
docker stop CONTAINER ID # 停止容器
docker kill CONTAINER ID # 强制停止容器
# CONTAINER ID 容器
常用其他命令
后台启动容器
# docker run -d 容器id
[root@localhost xiaoxie]# docker run -d centos # 后台启动容器
4c6d4b679d5cf24b171dec431f8e4d166ef5a0ce8426009f6bc413e8edec4a90 # 返回容器id
[root@localhost xiaoxie]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 问题 --> docker ps 之后发现没有正在运行的容器
# 原因 --> 容器启动之后发现没有运行在其上的前台程序,就自动停止了
# 总结 --> docker容器在后台运行必需要提供有效服务
查看日志命令
docker logs -f -t --tail int 容器id
[root@localhost xiaoxie]# docker logs -t -f --tail 10 4c6d
# 没有日志显示
# 编写一段shell脚本
[root@localhost xiaoxie]# docker run -d centos /bin/bash -c "while true; do echo hello world; sleep 1; done"
# /bin/bash 打开一个终端,若不指定,则执行程序设计者默认指定的程序(此程序可能不能执行shell命令)
# -c "while..." 在终端中执行该命令
[root@localhost xiaoxie]# docker logs -tf --tail 10 ac3
2024-01-22T01:40:36.936466726Z hello world
2024-01-22T01:40:37.938387807Z hello world
2024-01-22T01:40:38.940547381Z hello world
2024-01-22T01:40:39.942601351Z hello world
2024-01-22T01:40:40.944530138Z hello world
2024-01-22T01:40:41.946383214Z hello world
2024-01-22T01:40:42.948689202Z hello world
2024-01-22T01:40:43.950710379Z hello world
2024-01-22T01:40:44.952687777Z hello world
2024-01-22T01:40:45.955903867Z hello world
# -t 显示时间戳
# -f 格式化
# --tail int 显示最近int条日志,若不加上,则显示容器所有日志
查看容器中的进程信息
docker top 容器id
[root@localhost xiaoxie]# docker top ac3
Error response from daemon: container ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7 is not running
# 只能查看正在运行的容器
[root@localhost xiaoxie]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
360c83810a6b centos "/bin/bash -c 'while…" 4 seconds ago Up 4 seconds reverent_zhukovsky
[root@localhost xiaoxie]# docker top 360
UID PID PPID C STIME TTY TIME CMD
root 35312 35289 0 09:49 ?
root 35386 35312 0 09:50 ?
查看镜像和容器的元数据
# 镜像
[root@localhost xiaoxie]# docker inspect centos
[
{
"Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", # 镜像id
"RepoTags": [
"centos:latest" # 版本
],
"RepoDigests": [
"centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
],
"Parent": "",
"Comment": "",
"Created": "2021-09-15T18:20:05.184694267Z", # 创建时间
"Container": "9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1",
"ContainerConfig": {
"Hostname": "9bf8a9e2ddff",
"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",
"#(nop) ",
"CMD [\"/bin/bash\"]"
],
"Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",#镜像唯一标识符
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"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/bash"
],
"Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"Architecture": "amd64",
"Os": "linux",
"Size": 231268856,
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/merged",
"UpperDir": "/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/diff",
"WorkDir": "/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
# 容器
[root@localhost xiaoxie]# docker inspect ac3
[
{
"Id": "ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7",
"Created": "2024-01-22T01:33:33.709932938Z",
"Path": "/bin/bash", # 指定容器启动时 执行的可执行文件的路径
"Args": [ # 命令参数
"-c",
"while true; do echo hello world; sleep 1; done"
],
"State": {
"Status": "exited", # 容器状态
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2024-01-22T01:33:33.913971868Z",
"FinishedAt": "2024-01-22T01:45:55.97373744Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/hostname",
"HostsPath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/hosts",
"LogPath": "/var/lib/docker/containers/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7/ac3e148ce486515c9406264dcfe7ed5de452fff70a7120b89c9d08613cd8aea7-json.log",
"Name": "/tender_joliot", # 容器名称
"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,
"ConsoleSize": [
59,
114
],
"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",
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": [],
"BlkioDeviceWriteBps": [],
"BlkioDeviceReadIOps": [],
"BlkioDeviceWriteIOps": [],
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": [],
"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",
"/sys/devices/virtual/powercap"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067-init/diff:/var/lib/docker/overlay2/2fd3737be17334a5e630ce23be774b31d859be104da19a0362e59a1973f21a93/diff",
"MergedDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067/merged",
"UpperDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067/diff",
"WorkDir": "/var/lib/docker/overlay2/7de03009760d87a71eb69f50676c4113b70d2131cb7d2d814b413eef4cf80067/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "ac3e148ce486",
"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/bash",
"-c",
"while true; do echo hello world; sleep 1; done"
],
"Image": "centos",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"org.label-schema.build-date": "20210915",
"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": "dd2d2513cf1d09528ae8d57375c166d5711c8a7074a5cafffdb7f2f1ffa24d74",
"SandboxKey": "/var/run/docker/netns/dd2d2513cf1d",
"Ports": {},
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"ac3e148ce486"
],
"MacAddress": "02:42:ac:11:00:02",
"NetworkID": "56d59c49780411782a0ebf273ed19bba9fab690efe08569e78b0da2991bd0bf7",
"EndpointID": "",
"Gateway": "",
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DriverOpts": null,
"DNSNames": null
}
}
}
}
]
进入当前正在运行的容器
# 容器一般以后台的方式运行,有时候需要进入容器,修改一些配置
dockers exec -it 容器id COMMAND # 进入容器,开启一个新的终端并进入(常用)
[root@localhost xiaoxie]# docker exec -it 2ad /bin/bash
[root@2ad0db2056f7 /]#
docker attach 容器id # 进入容器正在执行的终端,不会启动新的进程
[root@localhost xiaoxie]# docker attach 2ad
[root@2ad0db2056f7 /]#
从容器拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
[root@localhost xiaoxie]# docker cp 2ad0db2056f7:/home/hello.json /home
Successfully copied 1.54kB to /home
# 只要容器的资源还存在,是否在运行都可以拷贝
# 拷贝是一个手动的过程,未来可以利用 -v 卷的技术,实现自动同步
小结
images # 查看本地镜像
search # 搜索镜像
pull # 拉取镜像 先在本地查找,没有则去hub仓库源中
rmi # 删除镜像
create # 创建容器
run # 创建并运行容器
pause # zan'j
ps # 查看正在运行的容器
rm # 删除容器
exec # 进入容器
attach # 进入容器
start # 运行容器
restart # 重新运行容器
stop # 停止容器
kill # 强制停止容器
logs # 查看容器日志
top # 查看容器中进程信息
inspect # 查看镜像或者容器的元数据
cp # 拷贝文件

作业1:部署nginx服务
# 1.搜索nginx版本 search
# 2.下载镜像 pull
# 3.运行容器 run
[root@localhost xiaoxie]# docker run -d --name nginx01 -p 8080:80 nginx
126156ff8b8c43c84aa00afa5eb5f0f4ceeb1aab2471d4b19c5b406eafe2f05d
# -d 后台运行
# --name 容器名称
# -p 宿主机端口:容器内部端口 端口暴露
[root@localhost xiaoxie]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
126156ff8b8c nginx "/docker-entrypoint.…" 8 seconds ago Up 7 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx01
# 4.测试服务
[root@localhost xiaoxie]# curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
# 进入nginx配置目录
[root@localhost xiaoxie]# docker exec -it nginx01 /bin/bash
root@126156ff8b8c:/# cd etc/nginx
root@126156ff8b8c:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params

作业2:部署tomcat服务器
[root@localhost xiaoxie]# docker run -d -p 8080:8080 --name tomcat tomcat
Unable to find image 'tomcat:latest' locally
latest: Pulling from library/tomcat
df2fac849a45: Already exists
c506251a0ae0: Already exists
127f7734cc88: Already exists
eabc79a4d7f6: Already exists
cb0704fc9e82: Already exists
9ea8abad4482: Already exists
603cbf094c6d: Pull complete
8f7f215520e6: Pull complete
Digest: sha256:a384d1dde45ce44c90d30ab920f5d020d44f20d4607cd001d4243c0cbbe4b335
Status: Downloaded newer image for tomcat:latest
1a37cbf104273b873197eb93e4fc97546fc08387990fe31d21c022d3f4404c58
# 问题:服务器返回404
# 解决:
# 进入容器内部
[root@localhost xiaoxie]# docker exec -it 1a3 /bin/bash
# 将webapps.dist/中的内容全部拷贝到webapps中
root@1a37cbf10427:/usr/local/tomcat# cp -r webapps.dist/* webapps

思考:每次操作tomcat中的文件都需要进入容器,如何在容器外部实现文件映射,在外面放置项目,自动同步到容器中
Docker 镜像
镜像原理
镜像是一个独立软件包,用来打包程序和其运行时所需要的环境、库和配置文件
如何得到一个镜像:
- 从仓库源获取
- 朋友拷贝给你
- 自己制作镜像,使用Dockerfile
联合文件系统:是一个高级、轻量、高性能的文件系统,我们下载镜像时一层一层的就是这些分层的文件系统,它们可以多个镜像共用,
docker的镜像实际上就是由一层一层的文件系统构成的
对于一个精简的OS系统,rootfs很小,使用的是宿主机的内核,只提供一些简单指令,对于不同发行的linux版本,也就是rootfs有差别,底层的bootfs是一致的
容器的启动是秒级的!而虚拟机是分钟级别的
镜像分层:所有的镜像都有一个基础镜像层,当我们修改的时候,就会在其上层创建一个新的镜像层,
我们下载的时候也是分层,这样如果有已经存在的层级,我们就可以实现复用
Docker的镜像都是只读的,当我们运行容器的时候,就是在镜像的上面加了一层可写层,这一层就叫做容器层,容器层之下的都叫做镜像层
提交镜像
在可写的容器层修改之后,可以 docker commit 保存容器的状态,封装成镜像
[root@localhost xiaoxie]# docker commit -a="xiaoxie" -m="add webapps and change the index.jsp" c4 tomcat02:1.0
sha256:ce4448807188519692bf7e6c4befa79937c9739df7bec84d28cea7a87450430c
[root@localhost xiaoxie]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat02 1.0 ce4448807188 13 seconds ago 458MB
tomcat latest 69bd221063cf 6 days ago 454MB
容器数据卷
问题:如果数据都存在容器中,那么如果容器一删除,数据也就全部丢失了
解决:
容器之间可以有一个数据共享的技术
Docker中的数据可以同步到本地
这就是卷技术,目录的挂载,将容器中的目录挂载到linux上
总结:容器的持久化和同步操作,容器之间可以数据共享
数据卷挂载
方式一:使用命令的方式挂载 -v
[root@localhost xiaoxie]# docker run -d -p 8080:8080 -v \ /home/xiaoxie/tomcat_test:/usr/local/tomcat/webapps/ROOT --name tomcat01 tomcat
c486c9a98d41c8c1ef53dc06ed796b5342751cb23319bde3d06bf8d1f5284087
# 将webapps.list/* 全部拷贝到webapps之后
[root@localhost xiaoxie]# cd tomcat_test/
[root@localhost tomcat_test]# ls
asf-logo-wide.svg bg-button.png bg-middle.png bg-nav.png bg-upper.png favicon.ico index.jsp RELEASE-NOTES.txt tomcat.css tomcat.svg WEB-INF
# 此后我们在容器外的tomcat_test中修改内容,就会自动同步到容器内中的webapps中
# 查看容器 docker inspect
"Mounts": [
{
"Type": "bind",
"Source": "/home/xiaoxie/tomcat_test", # 挂载的目标路径
"Destination": "/usr/local/tomcat/webapps/ROOT", # 源路径
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
具名和匿名挂载
# 匿名挂载
[root@localhost xiaoxie]# docker run -P -d -v /etc/nginx --name nginx01 nginx
a4fa7f44864c8b34e86bb43670943c1aa2fbd96bbfcc966a75816bb19a7fb919
# 查看 volume卷 的情况
[root@localhost xiaoxie]# docker volume ls
DRIVER VOLUME NAME
local cc0b38d987743e3d49f3c37ff66688d1c6dec177091271619bfba115e8061a78
# 具名挂载
[root@localhost xiaoxie]# docker run -P -d -v juming-nginx:/etc/nginx --name nginx02 nginx
d91af7f082f65cddf9e45cd4f7e0660f5ac3c6956cdb413c816d404ecec3e572
[root@localhost xiaoxie]# docker volume ls
DRIVER VOLUME NAME
# 这二者都没有指定容器外的映射路径
[root@localhost xiaoxie]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2024-01-24T01:57:10+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
具名和匿名挂载会挂载到 /var/lib/docker/volumes/xxx/_data 这个目录中
拓展:
docker run -P -d -v juming-nginx:/etc/nginx:ro --name nginx02 nginx
docker run -P -d -v juming-nginx:/etc/nginx:rw --name nginx02 nginx
ro # 只读
rw # 可读可写
初识Dockerfile
# 编写一个dockerfile
[root@localhost docker-test]# cat dockerfile1
# ===============================
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "---end---"
CMD /bin/bash
# ===============================
[root@localhost docker-test]# docker build -f dockerfile1 -t xiaoxie/centos .
[+] Building 0.1s (5/5) FINISHED docker:default
=> [internal] load build definition from dockerfile1 0.0s
=> => transferring dockerfile: 179B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/1] FROM docker.io/library/centos:latest 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:139235ade34847ff60bb087950d6bfc135d69865c42012862ca936647598ae1e 0.0s
=> => naming to docker.io/xiaoxie/centos 0.0s
# 进入容器查看
[root@localhost docker-test]# docker run -it xiaoxie/centos:1.1
[root@92e354af7d13 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Jan 23 19:06 dev
drwxr-xr-x. 1 root root 66 Jan 23 19:06 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 231 root root 0 Jan 23 19:06 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jan 23 14:49 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
drwxr-xr-x. 2 root root 6 Jan 23 19:06 volume01 # 这两个就是在创建镜像时,自动挂载的卷,
drwxr-xr-x. 2 root root 6 Jan 23 19:06 volume02 # 它们在容器外一定对应某一个目录
[root@localhost docker-test]# docker inspect 92
"Mounts": [
{
"Type": "volume",
"Name": "afde119ff5c6d0b3c69a66c107aaa0f09e2ef9e018615965c4b609e2854f223c",
"Source": "/var/lib/docker/volumes/afde119ff5c6d0b3c69a66c107aaa0f09e2ef9e018615965c4b609e2854f223c/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "3c8f8f4827b9fd072d0b73afa689d2b9978291f08bdfd785aee2ad50ea20ceb5",
"Source": "/var/lib/docker/volumes/3c8f8f4827b9fd072d0b73afa689d2b9978291f08bdfd785aee2ad50ea20ceb5/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# 它们就同步在容器外下列目录中
/var/lib/docker/volumes/afde119ff5c6d0b3c69a66c107aaa0f09e2ef9e018615965c4b609e2854f223c/_data
/var/lib/docker/volumes/3c8f8f4827b9fd072d0b73afa689d2b9978291f08bdfd785aee2ad50ea20ceb5/_data

DockerFile
Dockerfile介绍
dockerfile 是用来构建镜像的一个文件,里面是一些脚本指令,定义了构建镜像的步骤,源代码
dockerimages 是构建的镜像,企业最终交付的产品
docker容器就是镜像运行起来提供服务的
构建步骤
- 编写一个 dockerfile 文件
- docker build 构建镜像
- dockr run 运行镜像
- docker push 发布镜像
基础:
- 每个指令都是大写的
- 指令从上到下顺序执行
- # 表示注释
- 每个指令都会创建一个新的镜像层,并提交
Dockerfile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 构建镜像的作者 姓名+邮箱
RUN # 镜像构建时执行的命令
ADD # 添加新的内容,比如tomcat.tar.gz
WORKDIR # 自动切换到指定工作目录
VOLUME # 运行时挂载的目录
EXPOSE # 端口映射
CMD # 容器运行时执行的命令
ENTRYPOINT # 容器运行时执行的命令
ONBUILD # 使用该 Dockerfile 构建的最终镜像作为基础镜像时,成功构建之后执行的命令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建时设置环境变量
CMD 和 ENTRYPOINT 的区别
CMD # 只有最后面一个 CMD 命令才能被执行,且该命令在容器运行时可以被替换
ENTRYPOINT # 在容器运行时追加命令
# CMD
[root@localhost docker-test]# cat Dockerfile
FROM centos
CMD ["ls", "-a"]
[root@localhost docker-test]# docker build -t mycentos:0.1 .
[root@localhost docker-test]# docker run mycentos:0.1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
# CMD 不可以追加命令参数
[root@localhost docker-test]# docker run mycentos:0.1 -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
# 命令只能替换
[root@localhost docker-test]# docker run mycentos:0.1 ls -la
total 0
drwxr-xr-x. 1 root root 6 Jan 23 21:27 .
drwxr-xr-x. 1 root root 6 Jan 23 21:27 ..
-rwxr-xr-x. 1 root root 0 Jan 23 21:27 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jan 23 21:27 dev
drwxr-xr-x. 1 root root 66 Jan 23 21:27 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 233 root root 0 Jan 23 21:27 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jan 23 14:49 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
# ENTRYPOINT
[root@localhost docker-test]# cat Dockerfile
FROM centos
ENTRYPOINT ["ls", "-a"]
[root@localhost docker-test]# docker build -t mycentos:0.2 .
[root@localhost docker-test]# docker run mycentos:0.2
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost docker-test]# docker run mycentos:0.2 -l
total 0
drwxr-xr-x. 1 root root 6 Jan 23 21:31 .
drwxr-xr-x. 1 root root 6 Jan 23 21:31 ..
-rwxr-xr-x. 1 root root 0 Jan 23 21:31 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jan 23 21:31 dev
drwxr-xr-x. 1 root root 66 Jan 23 21:31 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 233 root root 0 Jan 23 21:31 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Jan 23 14:49 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
作业:构建自己的centos
# 1、编辑 Dockerfile 文件
[root@localhost docker-test]# cat Dockerfile
FROM centos
MAINTAINER xiaoxie<523934596@qq.com>
ENV PATH /home
WORKDIR $PATH
# 这里有点问题暂时未解决!!!!!!!!!!!!!!!
RUN yum -y install vim
RUN yum -y install net-tools
VOLUME ["volume01"]
EXPOSE 80
CMD ["ls", "-la"]
CMD /bin/bash
CMD echo $PATH
发布镜像
DockerHub
1、在 https://hub.docker.com/ 注册DockerHub账号
2、登录账号
[root@localhost docker-test]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Options:
-p, --password string # 密码
--password-stdin Take the password from stdin
-u, --username string # 用户名
3、本地提交镜像
[root@localhost docker-test]# docker push --help
Usage: docker push [OPTIONS] NAME[:TAG]
Options:
-a, --all-tags Push all tags of an image to the repository
--disable-content-trust Skip image signing (default true)
-q, --quiet Suppress verbose output
阿里云镜像服务
1、注册并登录阿里云账号
2、找到容器镜像服务
3、创建命名空间
4、创建容器镜像
5、浏览阿里云(其中有 docker push 的步骤)
小结

Docker 网络
#通过脚本一次创建6个redis配置
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
# 通过脚本一次启动6个redis容器
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port}
-v /mydata/redis/node-${port}/data:/data
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
P28中yum下载出现No URLs in mirrorlist error的原因大致为:
Centos8不再维护,在2022年1月31日,CentOS团队从官方镜像中移除CentOS 8的所有包。
解决方式:dockerfile第一行FROM centos:7。

浙公网安备 33010602011771号