docker命令基本使用与服务编排
docker命令基本使用
1、docker进程相关命令
-
启动docker服务
systemctl start docker -
停止docker服务
systemctl stop docker -
重启docker服务
systemctl restart docker -
查看docker服务状态
systemctl status docker -
设置开机启动docker服务
systemctl enable docker
2、docker镜像相关命令
-
查看docker镜像
-
查看镜像: 查看本地所有的镜像
[root@localhost ~]# docker images 镜像名称 版本号 镜像ID 镜像存在时间 镜像大小 REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 5d0da3dc9764 2 years ago 231MB [root@localhost ~]# docker images -q #查看所有的镜像ID 5d0da3dc9764
-
-
搜索镜像:从网络中查找需要的镜像
docker search 镜像名称 NAME:镜像的名称 DESCRIPTION:镜像的描述 STARS:镜像的大小 OFFICIAL:镜像是否是官方维护 如果至位【ok】则代表,该镜像是官方维护的镜像 注意:如果需要查看镜像的版本号,则需要到https://hub.docker.com的docker镜像仓库官方网站中去查看 [root@localhost ~]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx Official build of Nginx. 19730 [OK] unit Official build of NGINX Unit: Universal Web … 25 [OK] nginx/nginx-ingress NGINX and NGINX Plus Ingress Controllers fo… 89 nginxinc/nginx-unprivileged Unprivileged NGINX Dockerfiles 144 nginx/nginx-prometheus-exporter NGINX Prometheus Exporter for NGINX and NGIN… 39 nginxinc/nginx-s3-gateway Authenticating and caching gateway based on … 6 nginx/unit This repository is retired, use the Docker o… 64 nginx/nginx-ingress-operator NGINX Ingress Operator for NGINX and NGINX P… 2 nginxinc/amplify-agent NGINX Amplify Agent docker repository 1 nginx/nginx-quic-qns NGINX QUIC interop 1 nginxinc/ingress-demo Ingress Demo 4 nginxproxy/nginx-proxy Automated nginx proxy for Docker containers … 132 nginxproxy/acme-companion Automated ACME SSL certificate generation fo… 131 bitnami/nginx Bitnami nginx Docker Image 184 bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 32 ubuntu/nginx Nginx, a high-performance reverse proxy & we… 112 nginxinc/nginmesh_proxy_debug 0 nginxproxy/docker-gen Generate files from docker container meta-da… 16 nginxinc/mra-fakes3 0 kasmweb/nginx An Nginx image based off nginx:alpine and in… 7 nginxinc/nginmesh_proxy_init 0 nginxinc/mra_python_base 0 nginxinc/ngx-rust-tool 0 rancher/nginx-ingress-controller 12 -
拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为名称:版本号,如果版本号不指定则是最新的版本。 如果不知道镜像版本,可以去docker hub搜索对应镜像查看
docker pull 镜像名称
[root@localhost ~]# 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
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 years ago 231MB
-
删除镜像
docker rmi 镜像id # 删除指定本地镜像 docker rmi `docker images -q` # 删除所有本地镜
3、docker容器相关命令
-
查看容器
docker ps # 查看正在运行的容器 docker ps –a # 查看所有容器 -
创建并启动容器
docker run 参数 参数说明: •-i:保持容器运行。通常与-t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。 •-t:为容器重新分配一个伪输入终端,通常与-i 同时使用。 •-d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用dockerexec 进入容器。退出后,容器不会关闭。 •-it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器 •--name:为创建的容器命名使用-it的方式创建的容器,在退出容器之后,容器就自己关闭了,可以使用docker ps -a查看 [root@localhost ~]# docker run -it --name=c1 centos /bin/bash [root@032584224b03 /]# [root@032584224b03 /]# exit exit [root@localhost ~]# [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 032584224b03 centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago c1 使用-id创建出来的容器,不会立即进入容器里面,退出的时候也不会停止容器 [root@localhost ~]# docker run -id --name=c2 centos 1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1fe4f0cb8c99 centos "/bin/bash" 55 seconds ago Up 54 seconds c2 032584224b03 centos "/bin/bash" 5 minutes ago Exited (0) 3 minutes ago c1 -
进入容器
[root@localhost ~]# docker exec -it c2 /bin/bash [root@1fe4f0cb8c99 /]# -
停止容器
docker stop 容器名称 -
启动容器
docker start 容器名称 -
删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除
docker rm 容器名称 -
查看容器信息
docker inspect 容器名称 [root@localhost ~]# docker inspect c2 [ { "Id": "1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714", "Created": "2024-03-25T12:21:19.607717435Z", "Path": "/bin/bash", "Args": [], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 89946, "ExitCode": 0, "Error": "", "StartedAt": "2024-03-25T12:21:19.749264293Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6", "ResolvConfPath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/resolv.conf", "HostnamePath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/hostname", "HostsPath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/hosts", "LogPath": "/var/lib/docker/containers/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714/1fe4f0cb8c99992a4285598d7f6a6bab1a298ebba198f8a43e86d650f3624714-json.log", "Name": "/c2", "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": [ 43, 154 ], "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/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024-init/diff:/var/lib/docker/overlay2/9c386ad386c9a38d4fbff70d2adbca13527127609dd7bd8a0f4d3fd55c6a74d9/diff", "MergedDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024/merged", "UpperDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024/diff", "WorkDir": "/var/lib/docker/overlay2/3f824f921296beb5699222e8f8ff5c9e796ee9e8603e24d1241cf9c3ae23b024/work" }, "Name": "overlay2" }, "Mounts": [], "Config": { "Hostname": "1fe4f0cb8c99", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": true, "StdinOnce": false, "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": "45464f5cbb945ceb333d7f962bc2dcc227e6f67ffea4be26a2a8bda314059035", "SandboxKey": "/var/run/docker/netns/45464f5cbb94", "Ports": {}, "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "6ab3920f2846fc00456d31334a926d3190b287867be8c4e281dd0c466299d05f", "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, "MacAddress": "02:42:ac:11:00:02", "NetworkID": "86d1b8fcf7b4c1312b01326fdf6df21fdd3e19677d1887d15a8ca643507cb6cc", "EndpointID": "6ab3920f2846fc00456d31334a926d3190b287867be8c4e281dd0c466299d05f", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "DriverOpts": null, "DNSNames": null } } } } ] -
从容器内拷贝文件到主机
[root@localhost ~]# docker exec -it c_3 bash [root@4b7ee7877d0d usr]# pwd /usr [root@4b7ee7877d0d usr]# touch test #在容器内创建文件 [root@4b7ee7877d0d usr]# ls bin etc games include lib lib64 libexec local sbin share src test tmp [root@4b7ee7877d0d usr]# exit exit # 在主机上使用命令将容器内的文件拷贝到主机上面 docker cp 容器的ID:文件路径 主机的路径 [root@localhost ~]# docker cp c_3:/usr/test /home/ Successfully copied 1.54kB to /home/ [root@localhost ~]# ls /home/ chengtao cuiwei download go nginx_html_bak test xqj [root@localhost ~]#
4、docker容器的数据卷
数据卷
- 数据卷是宿主机中的一个目录或文件
- 当容器目录和数据卷目录绑定后,对方的修改会立即同步
- 一个数据卷可以被多个容器同时挂载
- 一个容器也可以被挂载多个数据卷

1、 配置数据卷
- 创建启动容器时,使用-v参数 设置数据卷
[root@localhost ~]# docker run -it --name=c1 -v /root/data:/root/data_container centos /bin/bash
[root@f407df6739cb /]# cd /root/
#容器内的data_container目录
[root@f407df6739cb ~]# ls -l
total 12
-rw-------. 1 root root 2361 Sep 15 2021 anaconda-ks.cfg
-rw-r--r--. 1 root root 608 Sep 15 2021 anaconda-post.log
drwxr-xr-x. 2 root root 6 Mar 25 12:42 data_container
-rw-------. 1 root root 2059 Sep 15 2021 original-ks.cfg
#宿主机的data目录
[root@localhost ~]# ll
总用量 10336
-rw-------. 1 root root 1217 3月 6 05:11 anaconda-ks.cfg
-rwxrwxrwx. 1 root root 10577344 3月 5 22:37 apache-tomcat-8.5.78.tar.gz
drwxr-xr-x. 2 root root 6 3月 25 20:42 data
drwxr-xr-x. 3 root root 53 3月 5 21:23 nginx
drwxr-xr-x. 3 root root 20 3月 17 16:47 sh
[root@localhost ~]#
在宿主机中的data目录下创建了一个test.txt的文件,同样的在容器里面的data_container目录也会生成一个test.txt 的文件
[root@localhost ~]# cd data/
[root@localhost data]# ll
总用量 0
[root@localhost data]# touch test.txt
[root@localhost data]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月 25 20:44 test.txt
[root@localhost data]#
[root@f407df6739cb data_container]# ls -l
total 0
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
[root@f407df6739cb data_container]#
2、两个容器挂载同一个数据卷,实现两个容器之间的数据交换
#创建C3容器
[root@localhost data]# docker run -it --name=c3 -v /root/data:/root/data centos
[root@98470426ff06 /]#
[root@98470426ff06 /]#
[root@98470426ff06 /]# cd /root/data/
[root@98470426ff06 data]# ls -l
total 4
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
[root@98470426ff06 data]#
#创建C4容器
[root@localhost data]# docker run -it --name=c4 -v /root/data:/root/data centos
[root@d5926b80c63b /]# cd /root/data/
[root@d5926b80c63b data]# ll
bash: ll: command not found
[root@d5926b80c63b data]# ls -l
total 4
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
[root@d5926b80c63b data]#
#C3和C4容器挂载的都是宿主机的同一个数据卷 /root/data
#在C3容器中的data目录中创建一个xqj.txt的文件
[root@98470426ff06 data]# echo hehe > xqj.txt
[root@98470426ff06 data]# ls -l
total 8
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
-rw-r--r--. 1 root root 5 Mar 25 12:58 xqj.txt
[root@98470426ff06 data]#
#在C4容器中可以看到所创建的xqj.txt文件已经被同步过来了
[root@d5926b80c63b data]# ls -l
total 8
-rw-r--r--. 1 root root 4 Mar 25 12:52 a.txt
-rw-r--r--. 1 root root 0 Mar 25 12:44 test.txt
-rw-r--r--. 1 root root 5 Mar 25 12:58 xqj.txt
[root@d5926b80c63b data]# cat xqj.txt
hehe
[root@d5926b80c63b data]#
3、数据卷容器
多容器进行数据操作
-
多个容器挂载同一个数据卷
-
数据卷容器
1、配置数据卷容器
-
创建启动c3数据卷容器,使用 –v 参数 设置数据卷
[root@localhost ~]# docker run -it --name=c3 -v /volume centos /bin/bash [root@9dcd3c810d0a /]# ls -l total 0 drwxr-xr-x. 2 root root 6 Mar 26 02:45 volume # 使用sinpect参数查看数据库容器对应的宿主机的目录 [root@localhost ~]# docker inspect c3 "Mounts": [ { "Type": "volume", "Name": "b4f6538092a466be04c9ec6709c8da535981fa7d1f60f0af4c21f73a516ec822", "Source": "/var/lib/docker/volumes/b4f6538092a466be04c9ec6709c8da535981fa7d1f60f0af4c21f73a516ec822/_data", #宿主机的目录 "Destination": "/volume", #docker容器目录 "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], -
创建启动 c1 c2 容器,使用 –-volumes-from 参数 设置数据卷
[root@localhost ~]# docker run -it --name=c1 --volumes-from c3 centos /bin/bash [root@9c48c283bf32 /]# ls -l total 0 drwxr-xr-x. 2 root root 6 Mar 26 02:45 volume [root@localhost ~]# docker run -it --name=c2 --volumes-from c3 centos /bin/bash [root@f1ec50c91653 /]# ls -l total 0 drwxr-xr-x. 2 root root 6 Mar 26 02:45 volume\1. 数据卷概念
• 宿主机的一个目录或文件
\2. 数据卷作用
• 容器数据持久化
• 客户端和容器数据交换
• 容器间数据交换
\3. 数据卷容器
• 创建一个容器,挂载一个目录,让其他容器继承自该容器( --volume-from )。
• 通过简单方式实现数据卷配置
5、DOCKer容器部署
1、 需求
- 在Docker容器中部署MySQL,并通过外部mysql客户端操作MySQL Server。
2、实现步骤
- 搜索mysql镜像
- 拉取mysql镜像
- 创建容器
- 操作容器中的mysql
3、MySQL部署:
-
容器内的网络服务和外部机器不能直接通信
-
外部机器和宿主机可以直接通信
-
宿主机和容器可以直接通信
-
当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上。外部机 器访问宿主机的该端口,从而间接访问容器的服务。
-
这种操作称为:端口映射

#搜索镜像
[root@localhost _data]# docker search mysql:5.6
NAME DESCRIPTION STARS OFFICIAL
webimp/mysql-56-slim MySQL with a small memory footprint, based o… 1
gmgdocker/mysql5.6 mysql:5.6 0
14221687/mysql mysql:5.6 0
deardooley/mysql Simple patch to the mysql:5.6 image to allow… 0
agaveapi/mysql extends trusted mysql:5.6 image with an addi… 0
xiematthew/lego-mysql with initialized SQL script from mysql:5.6 0
cnbbx/mysql docker pull cnbbx/mysql:5.6.48 0
jyhsanzero/mysql gcr.io/ml-pipeline/mysql:5.6 0
tcftcf/mysql docker run --name mysql -p 3306:3306 -e MY… 0
sujipillai/mysql mysql image built from base image: mysql:5.6… 0
hejiazhen/mysql-ms from mysql:5.6.45 0
bameri/mysql5 This MySql:5.6.23 image is propagated withou… 0
bameri/mysql This MySql:5.6.23 image is propagated with a… 0
sagardockerhub/mysql This is mysql:5.6 version image used for stu… 0
#下载镜像
[root@localhost _data]# docker pull mysql:5.6
5.6: Pulling from library/mysql
35b2232c987e: Pull complete
fc55c00e48f2: Pull complete
0030405130e3: Pull complete
e1fef7f6a8d1: Pull complete
1c76272398bb: Pull complete
f57e698171b6: Pull complete
f5b825b269c0: Pull complete
dcb0af686073: Pull complete
27bbfeb886d1: Pull complete
6f70cc868145: Pull complete
1f6637f4600d: Pull complete
Digest: sha256:20575ecebe6216036d25dab5903808211f1e9ba63dc7825ac20cb975e34cfcae
Status: Downloaded newer image for mysql:5.6
docker.io/library/mysql:5.6
#创建容器,设置端口映射、目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
[root@localhost ~]# mkdir mysql
[root@localhost ~]# cd mysql/
[root@localhost mysql]# docker run -id \
> -p 3307:3306 \
> --name=c_mysql \
> -v $PWD/conf:/etc/mysql/conf.d \
> -v $PWD/logs:/logs \
> -v $PWD/data:/var/lib/mysql \
> -e MYSQL_ROOT_PASSWORD=123456 \
> mysql:5.6
b69171bb83ea3be69cc50fa5f9d48fb87d76cf4f76ede170cf753be4b2071ac4
- 参数说明:
- -p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
- -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录
- -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录
- -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录
- **-e MYSQL_ROOT_PASSWORD=123456:**初始化 root 用户的密码。
进入容器
[root@localhost mysql]# docker exec -it c_mysql /bin/bash
root@b69171bb83ea:/# mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.51 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
mysql>
使用外部机器连接容器中的mysql
4、Tomcat部署
1、搜索tomcat镜像
[root@localhost db1]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL
tomcat Apache Tomcat is an open source implementati… 3651 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 114 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 50
bitnamicharts/tomcat 0
secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0
vulhub/tomcat 0
chainguard/tomcat Build, ship and run secure software with Cha… 0
samply/tomcat-common 0
wnprcehr/tomcat 0
rapidfort/tomcat10-openjdk17-ib 0
jumpserver/tomcat Apache Tomcat is an open source implementati… 0
eclipse/rdf4j-workbench Dockerfile for Eclipse RDF4J Server and Work… 8
semoss/docker-tomcat Tomcat, Java, Maven, and Git on top of debian 0
eclipse/hadoop-dev Ubuntu 14.04, Maven 3.3.9, JDK8, Tomcat 8 0
dhis2/base-dev Images in this repository contains DHIS2 WAR… 0
eclipse/alpine_jdk8 Based on Alpine 3.3. JDK 1.8, Maven 3.3.9, T… 1
openidentityplatform/openam-j2ee-agent-tomcat OpenAM Java EE Policy Agent for Apache Tomcat 1
dhis2/base Images in this repository contains DHIS2 WAR… 0
jelastic/tomcat An image of the Tomcat Java application serv… 4
cfje/tomcat-resource Tomcat Concourse Resource 2
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 7
amd64/tomcat Apache Tomcat is an open source implementati… 8
tomcat2111/phpredisadmin This is a Docker image for phpredisadmin 0
arm64v8/tomcat Apache Tomcat is an open source implementati… 11
softwareplant/tomcat Tomcat images for jira-cloud testing 0
2、拉取tomcat镜像
[root@localhost db1]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Waiting
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
0f611256ec3a: Pull complete
4f25def12f23: Pull complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost db1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 2 years ago 680MB
mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
centos latest 5d0da3dc9764 2 years ago 231MB
3、创建容器,设置端口映射、目录映射
[root@localhost ~]# cd tomcat/
[root@localhost tomcat]# pwd
/root/tomcat
[root@localhost tomcat]# docker run -id --name=c_tomcat -p 8089:8080 -v $PWD:/usr/local/tomcat/webapps tomcat
4ac313b6010a2a358036e6fdc6b5358ed4daa2cc9e926e5039ec86bfd25c7b33
参数说明:
-
**-p 8080:8080:**将容器的8080端口映射到主机的8080端口
**-v $PWD:/usr/local/tomcat/webapps:**将主机中当前目录挂载到容器的webapps
[root@localhost tomcat]# mkdir test
[root@localhost tomcat]# cat test/index.html
<html>
<h1>
HELLO TOMCAT_DOCKER
<h1>
</html>

5、Nginx部署
- 搜索nginx镜像
docker search nginx
- 拉取nginx镜像
docker pull nginx
- 创建容器,设置端口映射、目录映射
# 在/root目录下创建nginx目录用于存储nginx数据信息
mkdir ~/nginx
cd ~/nginx
mkdir conf
cd conf
# 在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容
vim nginx.conf
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
docker run -id --name=c_nginx \
-p 80:80 \
-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \
-v $PWD/logs:/var/log/nginx \
-v $PWD/html:/usr/share/nginx/html \
nginx
- 参数说明:
- -p 80:80:将容器的 80端口映射到宿主机的 80 端口。
- -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录
- -v $PWD/logs:/var/log/nginx:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录
- 使用外部机器访问nginx
6、radius部署
- 搜索redis镜像
docker search redis
- 拉取redis镜像
docker pull redis:5.0
- 创建容器,设置端口映射
docker run -id --name=c_redis -p 6379:6379 redis:5.0
- 使用外部机器连接redis
./redis-cli.exe -h 192.168.149.135 -p 6379
DockerFile
1、docker镜像原理
一、操作系统组成部分
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统 •
网络通信子系统
作业控制子系统 操
二、Linux文件系统由bootfs和rootfs两部分组成
• bootfs:包含bootloader(引导加载程序)和 kernel(内核)
• rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev, /proc,/bin,/etc等标准目录和文件
• 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu ,centos等

三、docker镜像原理
• Docker镜像是由特殊的文件系统叠加而成
• 最底端是 bootfs,并使用宿主机的bootfs
• 第二层是 root文件系统rootfs,称为base image
• 然后再往上可以叠加其他的镜像文件
• 统一文件系统(Union File System)技术能够将不同的 层整合成一个文件系统,为这些层提供了一个统一 的视角 ,这样就隐藏了多层的存在,在用户的角度看来,只存在 一个文件系统
• 一个镜像可以放在另一个镜像的上面。位于下面的镜像称 为父镜像,最底部的镜像成为基础镜像。
• 当从一个镜像启动容器时,Docker会在最顶层加载一个读 写文件系统作为容器

2、镜像制作
一、docker镜像如何制作
-
容器转为镜像
docker commit 容器id 镜像名称:版本号 docker save -o 压缩文件名称 镜像名称:版本号 docker load –i 压缩文件名称
将已经启动的tomca容器转换为镜像
[root@localhost ~]# docker commit 4ac313b6010a xqj:1.1
sha256:2d29c76a128b5b19ca76167164045ab8bcc505aa275024674d07cbd740007d63
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xqj 1.1 2d29c76a128b 6 seconds ago 680MB 刚刚从容器转换为镜像tomcat
nginx latest 605c77e624dd 2 years ago 141MB
tomcat latest fb5657adc892 2 years ago 680MB
redis 5.0 c5da061a611a 2 years ago 110MB
redis latest 7614ae9453d1 2 years ago 113MB
mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
centos latest 5d0da3dc9764 2 years ago 231MB
#打包,将从容器转换为镜像,然后打包成tar包
[root@localhost ~]# docker save -o xqj_tomcat.tar xqj:1.1
[root@localhost ~]# ll
-rw-------. 1 root root 692052480 3月 31 21:46 xqj_tomcat.tar
#将打包后的镜像文件,解压,并已容器的形式启动
[root@localhost ~]# docker load -i xqj_tomcat.tar
671d434396f2: Loading layer [==================================================>] 75.26kB/75.26kB
Loaded image: xqj:1.1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xqj 1.1 2d29c76a128b 7 minutes ago 680MB
nginx latest 605c77e624dd 2 years ago 141MB
tomcat latest fb5657adc892 2 years ago 680MB
redis 5.0 c5da061a611a 2 years ago 110MB
redis latest 7614ae9453d1 2 years ago 113MB
mysql 5.6 dd3b2a5dcb48 2 years ago 303MB
centos latest 5d0da3dc9764 2 years ago 231MB
[root@localhost ~]# docker run -id --name=new_tomcat xqj:1.1
4298cdea690683e86b3d76f036d31edd2927ede152ad0defd7e24c62b99ddad9
[root@localhost ~]# docker exec -it new_tomcat bash
root@4298cdea6906:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@4298cdea6906:/usr/local/tomcat# cd ~
root@4298cdea6906:~# ls
ITheima.txt xqj.txt
root@4298cdea6906:~#
3、DockerFile 概念
- dockerFile是一个文本文件
- 包含了一条条指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件 ,构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
Dochub网址:https://hub.docker.com
DockerFile 常用命令
| 关键字 | 作用 | 备注 |
|---|---|---|
| FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
| MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
| LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
| RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
| CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
| ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
| COPY | 复制文件 | build的时候复制文件到image中 |
| ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
| ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
| ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
| VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
| EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
| WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
| USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
| HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
| ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
| STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
| SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
一、定义dockerfile,发布spring-boot项目
实现步骤
-
将spring的jar包上传至服务器中
[root@localhost Dockerfile]# ll 总用量 22452 -rw-r--r--. 1 root root 22983101 4月 1 21:47 test2-0.0.1-SNAPSHOT.jar #jar包 [root@localhost Dockerfile]# -
编写dockerfile文件
[root@localhost Dockerfile]# cat springboot_dockerfile FROM openjdk:11 #定义父镜像为openjdk的11版本 ADD test2-0.0.1-SNAPSHOT.jar app.jar #镜像jar包添加到容器中,并重命名为app.jar CMD java -jar app.jar #定义容器启动时执行的命令,即运行jar包 -
构建镜像文件
docker bulid –f dockerfile文件路径 –t 镜像名称:版本 [root@localhost Dockerfile]# docker build -f ./springboot_dockerfile -t app . [root@localhost Dockerfile]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE app latest 7e5829644040 47 hours ago 682MB -
使用镜像文件启动容器,并成功访问
[root@localhost Dockerfile]# docker run -id --name=app -p 9000:8002 app:latest
二、自定义centos7镜像
要求:
自定义登录路径为 /usr
可以使用vim
实现步骤
-
编写dockerfile文件
[root@localhost docker_files]# cat centos_dockerfile FROM centos:7 RUN yum -y install vim WORKDIR /usr CMD /bin/bash -
生成镜像
[root@localhost docker_files]# docker build -f centos_dockerfile -t xqj_centos:1 . [+] Building 78.6s (7/7) FINISHED docker:default => [internal] load build definition from centos_dockerfile 0.0s => => transferring dockerfile: 170B 0.0s => [internal] load metadata for docker.io/library/centos:7 15.6s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => CACHED [1/3] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987 0.0s => [2/3] RUN yum -y install vim 61.9s => [3/3] WORKDIR /usr 0.0s => exporting to image 0.9s => => exporting layers 0.9s => => writing image sha256:2451823a271c3a8a95a37167b365f0ef9cccdc89b8432c842b5f96ceba5090aa 0.0s => => naming to docker.io/library/xqj_centos:1 -
使用镜像启动容器
[root@localhost docker_files]# docker run -id --name=c_3 xqj_centos:1 4b7ee7877d0d5256cbb63b04acfaaded69ce6b35520814930c29e81835f8e784 [root@localhost docker_files]# docker exec -it c_3 /bin/bash
Docker 服务编排
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停 ,维护的工作量会很大。
- 要从Dockerfile build image 或者去dockerhub拉取image
- 要创建多个container
- 要管理这些container(启动停止删除)
服务编排: 按照一定的业务规则批量管理容器
Docker Compose
Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建 启动和停止。使用步骤:
-
利用 Dockerfile 定义运行环境镜像
-
使用 docker-compose.yml 定义组成应用的各服务
-
运行 docker-compose up 启动应用

一、安装Docker Compose
# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
二、卸载Docker Compose
# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose
三、 使用docker compose编排nginx+springboot项目
- 创建docker-compose目录
mkdir ~/docker-compose
cd ~/docker-compose
2.编写 docker-compose.yml 文件
version: '3'
services:
nginx:
image: nginx
ports:
- 80:80
links:
- app
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
app:
image: app
expose:
- "8080"
3.创建./nginx/conf.d目录
mkdir -p ./nginx/conf.d
4.在./nginx/conf.d目录下 编写itheima.conf文件
server {
listen 80;
access_log off;
location / {
proxy_pass http://app:8080;
}
}
- 在~/docker-compose 目录下 使用docker-compose 启动容器
docker-compose up -d
5.测试访问

Docker 私有仓库
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像 到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜 像放到公网当中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
一、私有仓库搭建
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -id --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库 搭建成功
# 4、修改daemon.json
vim /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip
{"insecure-registries":["私有仓库服务器ip:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registry
二、将镜像上传至私有仓库
# 1、标记镜像为私有仓库的镜像
docker tag centos:7 私有仓库服务器IP:5000/centos:7
# 2、上传标记的镜像
docker push 私有仓库服务器IP:5000/centos:7
三、 从私有仓库拉取镜像
#拉取镜像
docker pull 私有仓库服务器ip:5000/centos:7
四、列出私有仓库的所有镜像
#curl http://仓库服务器ip:5000/v2/_catalog
[root@localhost ~]# curl http://10.201.9.133:5000/v2/_catalog
{"repositories":["app","centos"]}
五、列出私有仓库的 centos 镜像有哪些tag
# curl http://服务器ip:5000/v2/centos/tags/list
[root@localhost ~]# curl http://10.201.9.133:5000/v2/centos/tags/list
{"name":"centos","tags":["7"]}
更多推荐

所有评论(0)