Docker 是一个工具,让你把应用程序及其所有需要的环境打包成一个“盒子”,这个“盒子”可以在任何计算机上快速运行。
1、docker镜像操作
1.1 查看镜像
docker images # 查看镜像 == docker image list 或者 docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 16 months ago 13.3kB
docker images -q # 查看镜像的id
docker images -a # 查看所有镜像
1.2 搜索镜像
docker search [opts] xxx
docker search mysql # 搜索mysql相关的镜像
NAME DESCRIPTION STARS OFFICIAL
mysql MySQL is a widely used, open-source relation… 15356 [OK]
bitnami/mysql Bitnami container image for MySQL 118
elestio/mysql Mysql, verified and packaged by Elestio 0
rapidfort/mysql RapidFort optimized, hardened image for MySQL 25
google/mysql MySQL server for Google Compute Engine 25
circleci/mysql MySQL is a widely used, open-source relation… 30
ubuntu/mysql MySQL open source fast, stable, multi-thread… 64
javanile/mysql MySQL for development 0
eclipse/mysql Mysql 5.7, curl, rsync 1
ilios/mysql Mysql configured for running Ilios 1
bitnamicharts/mysql 0
mirantis/mysql 0
cimg/mysql 3
docksal/mysql MySQL service images for Docksal - https://d… 0
# --filter is-official=true 搜索官方镜像
# --filter stars=10 收藏数量至少10颗星
# --no-trunc 第二列的description不截断,完全展示出来
docker search --filter is-official=true --filter stars=10 --no-trunc mysql
NAME DESCRIPTION STARS OFFICIAL
mysql MySQL is a widely used, open-source relational database management system (RDBMS). 15364 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and MariaDB. 1024 [OK]
1.3 拉取镜像
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
# 别名 docker pull
docker image pull mysql # 拉取myql镜像,默认为最近版本
Using default tag: latest
latest: Pulling from library/mysql
6e839ac3722d: Pulling fs layer
ad912193ad5f: Download complete
25d13d87fd8d: Download complete
004d383c75ef: Download complete 6d9bbc82a0b8: Download complete 81fec07ea550: Download complete
83357cb2d3a5: Downloading [==============> ] 13.64MB/47.71MB
8ffe968b82c1: Download complete
30dfd9a7ed57: Downloading [=======> ] 10.16MB/65.9MB
35844ae33cbe: Waiting
docker image pull mysql:9.0 # 拉取指定版本的mysql镜像
1.4 删除镜像
docker image rm image1 image2 ... # 删除一个或者多个,可以使用镜像名或者镜像id指定
# 等价于docker image remove image1 ... 或者 docker rmi image1 ...
# 等价于docker rmi -f image1 ... # 表示强制删除
docker rmi -f $(docker images -aq) # 删除所有的镜像
docker rmi test:lates # 删除指定版本的镜像
2、docker容器操作
2.1 启动容器
docker run [opts] image
# 参数说明
--name="container name" 容器名称,用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器
-p 指定容器的端口 -p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口
容器端口
-P 随机指定端口
# 启动并进入容器
root@ubuntu2004:/home/scutech# docker run -it centos /bin/bash
[root@edc3bb92ed44 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@edc3bb92ed44 /]# exit # 从容器退出
exit
root@ubuntu2004:/home/scutech#
2.2 列出容器
docker ps
# 默认列出当前正在运行的容器
-a # 列出当前正在运行的容器,并且带有历史运行过的容器
-n=? # 列出最近创建的容器,?代表最近几个
-q # 只显示容器的编号
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu2004:/home/scutech# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edc3bb92ed44 centos "/bin/bash" 3 minutes ago Exited (0) 2 minutes ago jovial_kowalevski
2cc8b8022f62 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago nice_haibt
3e3b14ace368 hello-world "/hello" 14 hours ago Exited (0) 14 hours ago hopeful_chaum
root@ubuntu2004:/home/scutech# docker ps -n=1
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edc3bb92ed44 centos "/bin/bash" 4 minutes ago Exited (0) 2 minutes ago jovial_kowalevski
root@ubuntu2004:/home/scutech# docker ps -n=2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edc3bb92ed44 centos "/bin/bash" 4 minutes ago Exited (0) 2 minutes ago jovial_kowalevski
2cc8b8022f62 hello-world "/hello" 11 hours ago Exited (0) 11 hours ago nice_haibt
root@ubuntu2004:/home/scutech# docker ps -n=2 -q
edc3bb92ed44
2cc8b8022f62
2.3 退出容器
exit # 直接停止并退出容器
Ctrl + p + q # 快捷键,容器不停止退出
root@ubuntu2004:/home/scutech# docker run -it centos /bin/bash
[root@b35e15dfc2c4 /] root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b35e15dfc2c4 centos "/bin/bash" 17 seconds ago Up 16 seconds inspiring_boyd
2.4 删除容器
docker rm 容器id # 删除指定的容器,但不能删除正在运行的容器,否则,需要加上-f
docker rm -f $(docker ps -aq) # 查询所有的容器并强制删除
docker ps -a -q | xargs docker rm -f # 强制删除所有的容器
2.5 启动和停止容器
需要确保已经docker run,否则没有id。这里使用docker run --name=xxx指定的名称亦可。同理容器操作的其他命令。
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止容器
3、 其他常用命令
3.1 后台启动容器
# docker run -d 镜像名
docker run -d centos
# 问题:docker ps 发现centos停止了,并没有在后台
# docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有,就会自动停止
3.2 查看日志
docker logs -tf --tail num 容器id
-tf # -t显示时间戳;-f日志持续输出
--tail number # 要显示的日志条数
3.3 查看容器中的进程信息ps
docker top 容器id
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5fc9a4970ab centos "/bin/bash" 13 minutes ago Up 12 minutes test_centos
d9f61358b74e centos "/bin/bash" 15 minutes ago Up 14 minutes brave_knuth
root@ubuntu2004:/home/scutech# docker top b5fc9a4970ab
UID PID PPID C STIME TTY
TIME CMD
root 15532 15510 0 00:55 pts/0
00:00:00 /bin/bash
3.4 查看容器元数据
docker inspect 容器id # 查看容器元数据
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5fc9a4970ab centos "/bin/bash" 15 minutes ago Up 15 minutes test_centos
d9f61358b74e centos "/bin/bash" 18 minutes ago Up 17 minutes brave_knuth
root@ubuntu2004:/home/scutech# docker inspect b5fc9a4970ab
[
{
"Id": "b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c",
"Created": "2024-09-08T00:54:38.751116341Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 15532,
"ExitCode": 0,
"Error": "",
"StartedAt": "2024-09-08T00:55:23.428189587Z",
"FinishedAt": "2024-09-08T00:55:23.132383829Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/hostname",
"HostsPath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/hosts",
"LogPath": "/var/lib/docker/containers/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c/b5fc9a4970abc24f8c8b3460511f71f1b85ef86e6a98ec073d75a7261c233f3c-json.log",
"Name": "/test_centos",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "bridge",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
30,
120
],
"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/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26-init/diff:/var/lib/docker/overlay2/18414ee19fc732d6e729f96ab8d521b3faaa629ca093185e870d1a94c7ccf015/diff",
"MergedDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26/merged",
"UpperDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26/diff",
"WorkDir": "/var/lib/docker/overlay2/cc96d4a9003a84949311711f1fe8fcecd805387df514bd93dc2c3118853f3b26/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "b5fc9a4970ab",
"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": "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": "bbacec4f96b910a0fa2fbb3f8bb33e084382987fa13262357c1d45f4dfe86cff",
"SandboxKey": "/var/run/docker/netns/bbacec4f96b9",
"Ports": {},
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "985231f0255a5ad4d76c1f5e54f5780ba0df86e51fdaec10b50ec05f73d242a8",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null,
"NetworkID": "0b3c16f039187dfde85f9ed1dacc1ced3ff73e5105bbd713177c57bda1654574",
"EndpointID": "985231f0255a5ad4d76c1f5e54f5780ba0df86e51fdaec10b50ec05f73d242a8",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"DNSNames": null
}
}
}
}
]
3.5 进入当前正在运行的容器
# 方式一
docker exec -it 容器id bashshell
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5fc9a4970ab centos "/bin/bash" 18 minutes ago Up 17 minutes test_centos
d9f61358b74e centos "/bin/bash" 20 minutes ago Up 19 minutes brave_knuth
root@ubuntu2004:/home/scutech# docker exec -it b5fc9a4970ab /bin/bash
[root@b5fc9a4970ab /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
# 方式二
docker attach 容器id
root@ubuntu2004:/home/scutech# docker attach b5fc9a4970ab
[root@b5fc9a4970ab /]#
# 区别
docker exec # 进入容器气候开启一个新的终端,可以在里面操作
docker attach # 进入容器正在运行的终端,不会启动新的进程。
3.6 从容器拷贝文件到宿主机
droot@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9f61358b74e centos "/bin/bash" 29 minutes ago Up 28 minutes brave_knuth
root@ubuntu2004:/home/scutech# docker start test_centos
test_centos
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b5fc9a4970ab centos "/bin/bash" 27 minutes ago Up 3 seconds test_centos
d9f61358b74e centos "/bin/bash" 29 minutes ago Up 28 minutes brave_knuth
root@ubuntu2004:/home/scutech# docker attach test_centos
[root@b5fc9a4970ab /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@b5fc9a4970ab /]# touch home/docker.cpp
[root@b5fc9a4970ab /]# ls /home
docker.cpp
[root@b5fc9a4970ab /]# exit
exit
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d9f61358b74e centos "/bin/bash" 30 minutes ago Up 29 minutes brave_knuth
root@ubuntu2004:/home/scutech# docker cp test_centos:/home/docker.cpp /home/scutech # 拷贝数据
Successfully copied 1.54kB to /home/scutech
root@ubuntu2004:/home/scutech# ls
docker.cpp pre.sh
4、小结
5、部署nginx、tomcat
5.1 docker部署nginx
# 1、拉取nginx镜像
docker pull nginx
# 2、运行并测试
root@ubuntu2004:/home/scutech# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 39286ab8a5e1 3 weeks ago 188MB
hello-world latest d2c94e258dcb 16 months ago 13.3kB
centos latest 5d0da3dc9764 2 years ago 231MB
root@ubuntu2004:/home/scutech# docker run -d --name=nginx01 -p 3344:80 nginx
09399c975b900c7f3a31a09a96debfe6e8a6d9f249985c15c1dadae105f09903
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
09399c975b90 nginx "/docker-entrypoint.…" 9 seconds ago Up 8 seconds 0.0.0.0:3344->80/tcp, [::]:3344->80/tcp nginx01
root@ubuntu2004:/home/scutech# curl localhost:3344
<!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>
# 3、进入容器
root@ubuntu2004:/home/scutech# docker exec -it nginx01 /bin/bash
root@09399c975b90:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@09399c975b90:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@09399c975b90:/# cd /etc/nginx/
root@09399c975b90:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
5.2 docker部署tomcat
# 官方的使用方式
docker run -it -rm tomcat:9.0
# 一般用来测试,用完即删除容器,通过docker ps -a无法查到了。
# 1、下载tomcat
docker pull tomcat
# 2、启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat
# 3、拷贝资源到webapps目录下
root@ubuntu2004:/home/scutech# docker exec -it tomcat01 /bin/bash
root@65489e0503a7:/usr/local/tomcat# ls
bin conf lib logs NOTICE RELEASE-NOTES temp webapps.dist
BUILDING.txt CONTRIBUTING.md LICENSE native-jni-lib README.md RUNNING.txt webapps work
root@65489e0503a7:/usr/local/tomcat# cd webapps
root@65489e0503a7:/usr/local/tomcat/webapps# ls
root@65489e0503a7:/usr/local/tomcat# ls webapps.dist/
docs examples host-manager manager ROOT
root@65489e0503a7:/usr/local/tomcat# cp -r webapps.dist/ROOT/ webapps/
root@65489e0503a7:/usr/local/tomcat# ls webapps
ROOT
6、docker镜像
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是通常说的容器层,容器之下都叫镜像层。
实战
1、启动一个默认的tomcat容器
2、默认的tomcat是没有webapps应用的,如上部署tomcat
3、将ROOT应用拷贝到webapps中
4、将操作过的容器通过commit提交为一个镜像。之后就可以使用这个修改后的镜像了。
root@ubuntu2004:/home/scutech# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65489e0503a7 tomcat "catalina.sh run" 6 hours ago Up 6 hours 0.0.0.0:3355->8080/tcp, [::]:3355->8080/tcp tomcat01
root@ubuntu2004:/home/scutech# docker commit -a="huyuanhai" -m="add a default root web app" 65489e0503a7 tomcat_myself:1
.0
sha256:2e24d9ba550607d506b8f5b670c3b5eeefeae2722754fc4a33969d9fb4871dfd
root@ubuntu2004:/home/scutech# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat_myself 1.0 2e24d9ba5506 4 seconds ago 508MB
nginx latest 39286ab8a5e1 3 weeks ago 188MB
tomcat latest c2a444ea6cd7 4 weeks ago 508MB
hello-world latest d2c94e258dcb 16 months ago 13.3kB
7、容器数据卷
7.1 什么是容器数据卷
docker理念:将应用和环境打包成一个镜像。
如果数据都在容器中,那么将容器删除时,数据就会丢失!因此,需要进行数据持久化。
比如MySQL中的数据,需要将其存储在本地。
容器之间可以有一个数据共享技术!docker容器中产生的数据,同步到本地或者是容器之外的地方。
这就是卷技术,也是目录的挂在,将我们容器内的目录,挂载到容器在外的地方。
7.2 使用容器数据卷
方式一:直接使用docker run命令来实现挂载,加上选项-v
docker run -it -v 主机目录:容器内目录
root@ubuntu2004:/home/scutech# docker run -it -v /home/centos:/home centos /bin/bash
[root@c8d418098fb9 /]#
docker inspect查看元数据如图:
在宿主机中就可以操作对应的文件目录中的内容了,且两者是同步的,增删改文件都可以。即使容器被删除了,数据还是存在的。
7.3 实战mysql
# 获取镜像
docker pull mysql:5.7
# 运行容器,需要做数据挂载,安装启动mysql,需要配置密码
# 官方写法:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=password -d mysql:tag
# 启动
-d 后台启动
-p 端口映射
-v 挂载卷
-e 环境配置
--name 容器名称
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var
/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 启动成功之后,可以在本地使用mysql
映射到主机目录
7.4 具名挂载和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx001 -v /etc/nginx nginx
# 查看所有的volume的情况
root@ubuntu2004:/home/scutech# docker volume ls
DRIVER VOLUME NAME
local 8a6deb3bdbc58070e093df3be3534bca06918d3af0ce79ebea3e47db3732c7d5
# 匿名挂载就是在-v 时只写了容器内路径,没有写容器外路径!
# 具名挂载
docker run -d -P --name nginx003 -v /home/scutech/juming-nginx:/etc/nginx nginx
# 通过 -v 卷名:容器内路径
# 查看一下这个卷
docker volume inspect volume_name
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/volume_name/_data
通过具名挂载可以方便找到卷,大多数情况都使用具名挂载。
# 区别具名还是匿名挂载
-v 容器内路径 # 匿名
-v 卷名:容器内路径 # 具名
扩展:
# 通过 -v 容器内路径: + ro或者rw 改变读写权限
# 一旦设置了只读,说明这个路径只能通过宿主机来操作,容器内只读,不可写。
docker run -d -P --name nginx01 -v /home/scutech/nginx01:/etc/nginx:ro nginx # 只读
docker run -d -P --name nginx01 -v /home/scutech/nginx02:/etc/nginx:rw nginx # 可读写
7.5 初始dockerfile
dockerfile就是用来构建docker镜像的构建文件,是命令脚本。
通过这个脚本可以生成镜像,镜像是一层层的,脚本的一个个的命令,每个命令就是一层。
# 创建一个dockerfile文件,名字可以随机,建议dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["v1", "v2"]
CMD /bin/bash
# 启动huyuanhai/centos
docker run -it huyuanhai/centos /bin/bash
其中v1和v2和宿主机中的某个目录是映射的。
7.6 数据卷容器
多个容器之间共享数据
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
docker run -d -p 3311:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
docker run -d -p 3312:3306 --volumes-from mysql01 -e MYSQL_ROOT_PASSWORD=123456 --name mysql03 mysql:5.7
# 启动了三个mysql
root@ubuntu2004:~# docker ps | grep mysql
591b05414af9 mysql:5.7 "docker-entrypoint.s…" 24 seconds ago Up 23 seconds 33060/tcp, 0.0.0.0:3312->3306/tcp, [::]:3312->3306/tcp mysql03
df0e74fcf72c mysql:5.7 "docker-entrypoint.s…" 31 seconds ago Up 30 seconds 33060/tcp, 0.0.0.0:3311->3306/tcp, [::]:3311->3306/tcp mysql02
c226c17972f6 mysql:5.7 "docker-entrypoint.s…" About a minute ago Up About a minute 33060/tcp, 0.0.0.0:3310->3306/tcp, [::]:3310->3306/tcp mysql01
不同容器之间的数据是共同指向宿主机中的某个挂载位置的,不会因为删除了某个容器导致其他容器数据的缺失。
8、DockerFile
8.1 DockerFile介绍
dockerfile是用来构建docker镜像的文件!命令参数脚本!
构建步骤:
1、编写一个dockerfile文件
2、docker build 构建成为一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(DockerHub、阿里云镜像仓库)
很多官方镜像都是基础包,很多功能都没有,所以都需要构建自己需要的镜像。
8.2 DockerFile构建过程
基础知识
1、每个保留关键字(指令)都是必须是大写字母
2、执行从上到下顺序执行
3、# 表示注释
4、每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件,文件也十分简单。
Docker镜像逐渐成为企业交付的标准。
步骤:开发,部署,运维。。。缺一不可!
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages: 通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是镜像运行起来提供服务
8.3 DockerFile指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 添加内容,压缩包会自动解压
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 暴露端口
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承DockerFile 这个时候就会运行ONBUILD的指令,触发指令
COPY # 类似ADD,将文件拷贝到镜像中
ENV # 构建的时候设置环境变量
8.4 实战构建
FROM ubuntu:20.04
# RUN apt update && apt install -y \ build-essential \ cmake \ g++ \ libboost-dev
ENV DEBIAN_FRONTEND=noniteractive
ENV TZ=Etc/UTC
RUN apt update && apt install -y build-essential && apt install -y cmake && apt install -y libboost-dev
# build-essential \
# cmake
# ilibboost-dev
WORKDIR /app
COPY . .
RUN mkdir build && cd build && cmake .. && make
CMD ["./app"]
docker build -f Dockerfile -t myxxx:1.0 .
8.5 CMD和ENTRYPOINT 区别
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
如果上述CMD改成了ENTRYPOINT来实现,那么在docker run xxx -l 是可以继续往后追加的。
8.6 实战tomcat
tomcat + jdk
在ubuntu22.04镜像的基础上配置了tomcat和jdk,并将tomcat启动。
FROM ubuntu:22.04
# MAINTAINER huyuanhai<5533qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u181-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.94.tar.gz /usr/local
RUN apt update
RUN apt install -y vim
ENV WORKSPACE=/usr/local
WORKDIR $WORKSPACE
ENV JAVA_HOME=/usr/local/jdk1.8.0_181
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME=/usr/local/apache-tomcat-9.0.94
ENV CATALINA_BASH=/usr/local/apache-tomcat-9.0.94
ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD ${CATALINA_HOME}/bin/startup.sh && tail -f ${CATALINA_HOME}/logs/catalina.out
生成镜像
docker build -t utomcat .
启动容器
docker run -d -p 9999:8080 utomcat
在宿主机上可以通过以下命令访问tomcat
curl localhost:9999
也可以在启动的时候进行数据卷的挂载,可以在宿主机发布应用。
8.7 发布镜像到DockerHub
1、首先要在DockerHub上注册登录账号
2、在宿主机上登录这个账号,使用docker login
命令
root@ubuntu2004:~/ubuntu# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username
root@ubuntu2004:~/ubuntu# docker login -u hyh.18816485035@gmail.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores
Login Succeeded
3、登录成功之后,可以提交镜像到DockerHub了,使用 docker push
命令
# 先给要提交的镜像打标签
root@ubuntu2004:~/ubuntu# docker tag utomcat:latest huyuanhai/utomcat:1.0 # 先打标签
root@ubuntu2004:~/ubuntu# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test02 latest b32d47c8337d 51 minutes ago 591MB
test01 latest 7efe3f0e79fd 56 minutes ago 591MB
huyuanhai/utomcat 1.0 e50385240b8a About an hour ago 591MB
utomcat latest e50385240b8a About an hour ago 591MB
# 然后推送push
root@ubuntu2004:~/ubuntu# docker push huyuanhai/utomcat:1.0
The push refers to repository [docker.io/huyuanhai/utomcat]
5f70bf18a086: Pushed
e08d3834731a: Pushed
f5a51cf1859c: Pushed
bbb2b13f1f8a: Pushed
d9074cdd8ebc: Pushed
1b9b7346fee7: Pushed
1.0: digest: sha256:150a4f1a746560d9ee1cff1334995c22a37e27601e12cf0714b466cd5955f8df size: 1579
9、Docker 搭建C++开发环境
基于ubuntu:22.04 搭建一个镜像,要求具备C++开发的相关环境,包括GNU工具集、CMake、boost库、ACE库等。
Dockerfile生成镜像时会将当前工作目录中的项目拷贝到镜像中,并处理,生成对应可执行程序。当生成可执行程序之后进入容器,让用户选择执行程序还是在容器中继续操作。生成的文件都是在build文件夹中,整个项目在启动容器时做映射,为此,可以在宿主机查看所有项目相关的文件。
Dockerfile如下:
FROM ubuntu:22.04
LABEL maintainer="huyuanhai <553354863@qq.com>"
RUN apt update
RUN apt install -y vim net-tools
RUN apt install -y build-essential cmake make
RUN apt install -y libboost-dev libace-dev
ENV WORKSPACE=/usr/local/project
WORKDIR $WORKSPACE
COPY . . # 拷贝项目到工作区 $WORKSPACE
CMD mkdir build && cd build && cmake .. && make && /bin/bash
.dockerignore文件如下:
# 忽略编译生成的 build 目录
build/
run.sh
# 忽略 git 相关文件
.git
.gitignore
# 忽略临时文件
*.tmp
*.log
*.swp
# 忽略 IDE 配置文件
.vscode/
.idea/
# 忽略文档
*.md
*.txt
# 忽略 Dockerfile 本身
Dockerfile
生成镜像
docker build -t test_pro:1.0 .
run.sh执行脚本
rm -rf build # 必须先删除,否则会失败
docker run -it --rm -v $PWD:/usr/local/project test_pro:1.0