Docker的使用
1.Docker是什么:
- Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
- Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。
- Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
- 在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
- 下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
- Docker是一款针对程序开发人员和系统管理员来开发、部署、运行应用的一款虚拟化平台。Docker 可以让你像使用集装箱一样快速的组合成应用,并且可以像运输标准集装箱一样,尽可能的屏蔽代码层面的差异。Docker 会尽可能的缩短从代码测试到产品部署的时间。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker组件 - The Docker Engine – Docker Engine 是一个基于虚拟化技术的轻量级并且功能强大的开源容器引擎管理工具。它可以将不同的 work flow 组合起来构建成你的应用。
- Docker Hub 可以分享和管理你的images镜像的一个 Saas 服务
2.Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
3.Docker名词概念
- 镜像(image):docker的镜像好比就是一个容器,可以通过这个模板来创造容器服务,通过这个镜像可以创造多个容器(最终服务运行或者项目运行就只在容器中的),
- 容器(container):Docker利用利用容器技术,独立运行一个或者一组应用通过镜像来创建的(可以把容器当作一个linux);
- 仓库(repository):仓库就是用来存放镜像的地方。
- 公有仓库:私有仓库:
4.安装Docker
环境准备
前提:需要会linux
连接linux
安装
#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
#5.启动Docker
systemctl start docker
#6.查看是否安装成功
docker version
#7.hello-word
docker run hello-word
#8.查看docker镜像
docker images
5.配置阿里云镜像加速
6.docker常用命令
docker version #打印docker基本信息
docker info #打印docker详细系统信息:镜像/容器/数量。。。
docker 命令 --help #帮助命令
官方文档
地址: https://docs.docker.com/reference/
镜像命令
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 2 months ago 13.3kB
#解释
REPOSITORY #镜像到仓库源
TAG #镜像的标签
IMAGE ID #镜像的id
CREATED #镜像的创建时间
SIZE #镜像的大小
#可选项
[root@localhost /]# docker images --help
Usage: docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
-a, --all Show all images (default hides intermediate images)
--digests Show digests
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print images using a Go template
--no-trunc Don't truncate output
-q, --quiet Only show image IDs
#解释
-a, --all #列出所有镜像
-f, --filter filter #过滤
-q, --quiet #只显示镜像的id
搜索镜像
docker search
#例:搜索MySQL
[root@localhost /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10827 [OK]
mariadb MariaDB Server is a high performing open sou… 4084 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 799 [OK]
percona Percona Server is a fork of the MySQL relati… 537 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 87
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 82
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
bitnami/mysql Bitnami MySQL Docker Image 51 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 42
deitch/mysql-backup REPLACED! Please use http://hub.docker.com/r… 41 [OK]
prom/mysqld-exporter 39 [OK]
tutum/mysql Base docker image to run a MySQL database se… 35
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 29 [OK]
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 28
centos/mysql-56-centos7 MySQL 5.6 SQL database server 20
circleci/mysql MySQL is a widely used, open-source relation… 20
mysql/mysql-router MySQL Router provides transparent routing be… 19
arey/mysql-client Run a MySQL client from a docker container 17 [OK]
fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 12 [OK]
yloeffler/mysql-backup This image runs mysqldump to backup data usi… 7 [OK]
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
devilbox/mysql Retagged MySQL, MariaDB and PerconaDB offici… 3
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 2 [OK]
jelastic/mysql An image of the MySQL database server mainta… 1
widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 1 [OK]
#可选项
--filter=STARS=3000 #搜索出镜像的STARS大于3000的
下载镜像
[root@localhost /]# docker pull --help
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Pull an image or a repository from a registry
Options:
-a, --all-tags Download all tagged images in the repository
--disable-content-trust Skip image verification (default true)
--platform string Set platform if server is multi-platform capable
-q, --quiet Suppress verbose output
#例:下载mysql
# 下载镜像 docker pull 镜像名[:tag]
[root@localhost /]# docker pull mysql
Using default tag: latest #默认最新版本
latest: Pulling from library/mysql
f7ec5a41d630: Pull complete #分层下载,docker image的核心,联合文件系统(当下载此镜像其他版本的时候可共用这部分东西)
9444bb562699: Pull complete
6a4207b96940: Pull complete
181cefd361ce: Pull complete
8a2090759d8a: Pull complete
15f235e0d7ee: Pull complete
d870539cd9db: Pull complete
493aaa84617a: Pull complete
bfc0e534fc78: Pull complete
fae20d253f9d: Pull complete
9350664305b3: Pull complete
e47da95a5aab: Pull complete
Digest: sha256:04ee7141256e83797ea4a84a4d31b1f1bc10111c8d1bc1879d52729ccd19e20a #签名信息
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址 docker pull mysql === docker pull docker.io/library/mysql:lates
删除镜像
[root@localhost /]# docker rmi -f [REPOSITORY]/[IMAGE ID] #删除指定(多个以空格隔开)
#rm 删除
#i images镜像
#-f 全部
#REPOSITORY 仓库名称
#IMAGE ID 镜像id
[root@localhost /]# docker rmi -f $(docker images -a) #删除所有
7.容器命令
有了镜像才可以创建容器
- 1.下载容器
[root@localhost /]# docker pull centos
- 2.新建容器并启动
docker run [可选参数] image
#参数说明
--name="name" #容器名字
-d #后台方式运行
-i/-t/-it #使用交互方式运行,进入容器查看内容
-p #(小写)指定容器端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P #(大写)随机指定端口
#启动并进入容器(容器内的centos是基础版的,好多命令都不完善)
[root@localhost /]# docker run -it centos /bin/bash
[root@b84218946270 /]#
#退出容器
[root@b84218946270 /]# exit #容器停止并退出
ctrl+p+q #容器不停止退出(mac:ctrl+l+q)
- 3.列出所有正在运行的容器
[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
b84218946270 centos "/bin/bash" 4 minutes ago Exited (127) 2 minutes ago vigilant_curran
addb8082a355 hello-world "/hello" 20 hours ago Exited (0) 20 hours ago pedantic_mendel
#常用参数
-a #列出所有正在运行的和历史运行的
-n=? #显示最近创建的容器
-q #只显示容器的编号
- 4.删除容器
docker rm 容器id #删除指定容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有容器
docker -a -q|xargs docker rm #删除所有容器
- 5.容器的启动和停止
docker start 容器id #启动
docker restart 容器id #重启
docker stop 容器id #停止正在运行的
docker kill 容器id #强制停止正在运行的
- 6.常用其他命令
#1. 日志查看
[root@localhost /]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
-n, --tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m for 42 minutes)
# 查看容器日志(10条)
[root@localhost /]# docker logs -tf --tail 10 123e3635bc33
#查看容器中的进程信息
docker top 容器id
#例
[root@localhost /]# docker top 123e3635bc33
UID PID PPID C STIME TTY TIME CMD
root 6292 6272 0 15:19 pts/0 00:00:00 /bin/bash
#2.查看镜像元数据
docker inspect 容器id
#例
[root@localhost /]# docker inspect 123e3635bc33
[
{
"Id": "123e3635bc33ad086c2d015f5eaee45d2114bb23ab7a498a5d21884cc3eafe57",
"Created": "2021-05-05T07:19:13.039140251Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 6292,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-05-05T07:19:13.462028728Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
"ResolvConfPath": "/var/lib/docker/containers/123e3635bc33ad086c2d015f5eaee45d2114bb23ab7a498a5d21884cc3eafe57/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/123e3635bc33ad086c2d015f5eaee45d2114bb23ab7a498a5d21884cc3eafe57/hostname",
"HostsPath": "/var/lib/docker/containers/123e3635bc33ad086c2d015f5eaee45d2114bb23ab7a498a5d21884cc3eafe57/hosts",
"LogPath": "/var/lib/docker/containers/123e3635bc33ad086c2d015f5eaee45d2114bb23ab7a498a5d21884cc3eafe57/123e3635bc33ad086c2d015f5eaee45d2114bb23ab7a498a5d21884cc3eafe57-json.log",
"Name": "/flamboyant_gould",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/6b71fa2f61108ed9d5ad3c091edc80bcdb17bedd8d77fb540cb961dc725ce481-init/diff:/var/lib/docker/overlay2/c0aebdce96687af8d683161fa98f26fd6532554e993fc6c419a7599a8db7c255/diff",
"MergedDir": "/var/lib/docker/overlay2/6b71fa2f61108ed9d5ad3c091edc80bcdb17bedd8d77fb540cb961dc725ce481/merged",
"UpperDir": "/var/lib/docker/overlay2/6b71fa2f61108ed9d5ad3c091edc80bcdb17bedd8d77fb540cb961dc725ce481/diff",
"WorkDir": "/var/lib/docker/overlay2/6b71fa2f61108ed9d5ad3c091edc80bcdb17bedd8d77fb540cb961dc725ce481/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "123e3635bc33",
"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": "20201204",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS"
}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "d38b6ae37b2457b244b9d0edf1f25f65936fae4efb4d6e8e50265158ec888d01",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/d38b6ae37b24",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "3e8759841b6f156289fdffbb72aa5b4a71fd0d958cfb09f8bfc151a905971e8d",
"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": "ba087998ec92c84db4cf2abb8f671c1d5e2870a5c48408fdba7309a68441ea47",
"EndpointID": "3e8759841b6f156289fdffbb72aa5b4a71fd0d958cfb09f8bfc151a905971e8d",
"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
}
}
}
}
]
#3.进入当前正在运行的容器
#我们通常容器都是使用后台方式运行的,需要进入容器修改一些配置
#方式一
docker exec -it 容器id #进入容器后开启一个新的终端,可以在里边操作(常用)
#例
[root@localhost /]# docker exec -it 123e3635bc33 /bin/bash
[root@123e3635bc33 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@123e3635bc33 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:19 pts/0 00:00:00 /bin/bash
root 15 0 0 07:34 pts/1 00:00:00 /bin/bash
root 30 15 0 07:35 pts/1 00:00:00 ps -ef
#方式二
docker attach 容器id #进入容器正在执行的终端,不会启动新的进程
[root@localhost /]# docker attach 123e3635bc33
[root@123e3635bc33 /]#
#4.从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 主机路径
8.安装nginx
安装
docker search nginx #搜索ngins
docker pull nginx #下载nginx
docker run -d --name nginx -p 8001:80 nginx #启动nginx
curl localhost:8001 查看nginx
外网访问nginx:linuxHost+:8001
- docker是装在虚拟机上的,上面的命令是映射到虚拟机的80端口,需要把防火墙(包括docker/虚拟机/nginx容器 的防火墙)打开,或者打开端口才能被外网访问
配置文件
[root@localhost /]# docker exec -it nginx /bin/bash #进入容器
root@201ad44a0fda:/# whereis nginx #找到nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@201ad44a0fda:/# cd etc/nginx #打开文件夹
root@201ad44a0fda:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
9.安装tomcat
[root@localhost /]# docker pull tomcat #下载
Using default tag: latest
latest: Pulling from library/tomcat
bd8f6a7501cc: Pull complete
44718e6d535d: Pull complete
efe9738af0cb: Pull complete
f37aabde37b8: Pull complete
b87fc504233c: Pull complete
8bf93eef8c9e: Pull complete
8d33b4df10ef: Pull complete
2d77aa1a5442: Pull complete
baa04cc4071d: Pull complete
a3a752513415: Pull complete
Digest: sha256:0509684774ac53d8b152f4a50dd92889218a8633c0feddb4b35d092e55cd215d
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest
[root@localhost /]# docker run -d --name tomcat -p 8080:8080 tomcat #启动
dbfff84c135c8404add88e44033a8b6b63be804fa3e1412adf831512fd4063aa
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dbfff84c135c tomcat "catalina.sh run" 6 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp tomcat
201ad44a0fda nginx "/docker-entrypoint.…" 4 hours ago Up 4 hours 0.0.0.0:8001->80/tcp, :::8001->80/tcp nginx
[root@localhost /]# curl localhost:8080 #查看
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/9.0.45</h3></body></html>
外网查看
这是由于阿里下载的镜像都是阉割版的
10.Portainer可视化面板安装
Portaniner:Docker图形化管理
docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
启动后外网查看
11.commit镜像
docker commit 提交容器成为一个新的副本
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
12.容器数据卷
**容器数据卷:**如果数据都在容器中,那么容器删除,数据就会丢失。容器之间可以有一个数据共享的技术,在docker产生的数据,同步到本地,这就是卷技术。也就是目录的挂载,将我们容器内的目录,挂载到linux上。容器的持久化和同步操作。容器间也可以数据共享的。
使用数据卷
方式一,直接使用命令挂载
docker run -it -v 主机目录:容器内目录
#测试
#挂载并进入
[root@os7master /]# docker run -it -v /home/data:/home centos /bin/bash
#退出容器
[root@31ee6282d035 /]# exit
#查看容器状态
[root@os7master /]# docker inspect 31ee6282d035
#查看挂载信息
"Mounts": [
{
"Type": "bind",
"Source": "/home/data", #主机内地址
"Destination": "/home", #容器内地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
#此挂载过程是双向的,也就是在容器内修改文件后会同步到主机,在主机内修改后也可以同步到容器内,但是会占用2倍的存储
#应用场景:nginx等配置文件
安装MySQL
#获取镜像
docker pull mysql
#启动
#官方命令:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
[root@os7master /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Citygis@1613 --name mysql01 mysql
# -d:后台运行
# -p:端口映射
# -v:数据卷挂载
# -e:环境配置(mysql密码)
# --name:起的一个容器名字
测试
外部连接mysql
**连接说明:**外部连接工具连上主机的3306,再由主机映射到容器的3306端口,连接到容器内的mysql
查看挂载
-1.查看当前主机文件
- 2.创建一个数据库
- 3.再次查看主机文件
具名挂载和匿名挂载
#匿名挂载
#例如使用挂载时没有指定容器内目录卷,只指定了主机的目录就会出现匿名挂载
docker run -d -P --name nginx01 -v /etc/nginx/ nginx
#具名挂载
#通过-v 卷名:容器内路径
docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx nginx
查看具名容器内卷的地址命令:
docker volume inspect 卷名
我们通过具名挂载可以方便的找到我们需要的卷 。
区分匿名挂载、具名挂载、指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /主机路径:/容器内路径 指定路径挂载
Dockerfile方式挂载
13.Dockerfile
**Dockerfile:**构建docker镜像的构建文件。定义了一切步骤,命令参数脚本。
**Docker Images:**通过Dockerfile构建生成的镜像,最终发布运行的产品。
**Docker容器:**镜像运行起来提供服务的。
构建步骤
- 1.编写一个dockerfile文件
- 2.docker build构建成为一个镜像。
- 3.docker run 运行镜像
- 4.docker push 发布镜像(dockerHub/阿里云镜像仓库)
查看官方是怎么做的
在 Docker随便搜索一个镜像:在Description点击一个版本号,跳转到github上
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL \
org.label-schema.schema-version="1.0" \
org.label-schema.name="CentOS Base Image" \
org.label-schema.vendor="CentOS" \
org.label-schema.license="GPLv2" \
org.label-schema.build-date="20201113" \
org.opencontainers.image.title="CentOS Base Image" \
org.opencontainers.image.vendor="CentOS" \
org.opencontainers.image.licenses="GPL-2.0-only" \
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
很多官方镜像都是基础包,很多功能都没有,我们通常会自己搭建
Dockerfile构建
基础知识:
1.每个保留关键字都必须是大写字母
2.指令从上到下顺序执行
3.# 表示注释
4.每一个指令都会创建提交一个新的镜像层
dockerfile是面向开发的,以后发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单。
Dockerfile的指令
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的:姓名+邮箱
RUN #镜像构建的时候运行的命令
ADD #步骤,tomcat镜像,这个tomcat压缩包就是添加内容
WORKDIR #镜像的工作目录
VOLUME #设置容器卷,挂载主机目录
EXPOSE #暴露端口
CMD #指定容器启动的时候要运行的的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动的时候要运行的的命令,可以追加命令
ONBUILD #当构建一个被继承的Dockerfile这个时候就会运行ONBUILD的指令
COPY #类似ADD命令:将我们的文件拷贝到镜像中
ENV #构建的时候设置环境变量
创建一个自己的contos
#编写Dockerfile文件
FROM centos
MAINTAINER citygis<citigis@qq.com>
ENY MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
#通过Dockerfile构建镜像
#命令 docker build -f dockerfile文件路径 -t 要构建的名字:[tag] .
[root@os7master docker]# docker build -f mydockerfile -t mycentos:0.1 .
#测试运行
[root@os7master docker]# docker run -it mycentos:0.1
[root@22ea95e6d69a local]# pwd
/usr/local
#之前不能运行的命令,通过我们的dockerfile命令添加,已经可以用了
#列出本地进行的变更历史
[root@os7master docker]# docker history 25af26eaffde
IMAGE CREATED CREATED BY SIZE COMMENT
25af26eaffde 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
5451c514599d 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
730bae41115f 8 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
a72a7853d954 8 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
a169a2032949 8 minutes ago /bin/sh -c yum -y install net-tools 14.3MB
d3d00b826c65 8 minutes ago /bin/sh -c yum -y install vim 58MB
9b7468d57605 9 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
451b4dc6bf63 9 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
0773789fe0fd 9 minutes ago /bin/sh -c #(nop) MAINTAINER citygis<citigi… 0B
300e315adb2f 5 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 5 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 5 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b7… 209MB
CMD 和 ENTRYPOINT 的区别
CMD #指定容器启动的时候要运行的的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动的时候要运行的的命令,可以追加命令
#创建 CMD测试
[root@os7master docker]# vi dockerfiletest
FROM centos
CMD ["ls","-a"]
#构建
[root@os7master docker]# docker build -f dockerfiletest -t cmdtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : CMD ["ls","-a"]
---> Running in 18eeb62720d9
Removing intermediate container 18eeb62720d9
---> f072480f215d
Successfully built f072480f215d
Successfully tagged cmdtest:latest
#运行 发现命令生效
[root@os7master docker]# docker run f072480f215d
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#追加命令
[root@os7master docker]# docker run f072480f215d -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
#CMD情况下 -l替换了["ls","-a"],-l不是命令,所以报错
#创建ENTRYPOINT
[root@os7master docker]# cat dockerfiletest
FROM centos
ENTRYPOINT ["ls","-a"]
#构建
[root@os7master docker]# docker build -f dockerfiletest -t entrypointtest .
Sending build context to Docker daemon 3.072kB
Step 1/2 : FROM centos
---> 300e315adb2f
Step 2/2 : ENTRYPOINT ["ls","-a"]
---> Running in c1bc231b0110
Removing intermediate container c1bc231b0110
---> a59c58d6a53c
Successfully built a59c58d6a53c
Successfully tagged entrypointtest:latest
#运行
[root@os7master docker]# docker run a59c58d6a53c
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#追加命令 -l 成功追加,命令变为 ls -al
[root@os7master docker]# docker run a59c58d6a53c -l
total 0
drwxr-xr-x. 1 root root 6 May 8 13:15 .
drwxr-xr-x. 1 root root 6 May 8 13:15 ..
-rwxr-xr-x. 1 root root 0 May 8 13:15 .dockerenv
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 340 May 8 13:15 dev
drwxr-xr-x. 1 root root 66 May 8 13:15 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 Dec 4 17:37 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. 130 root root 0 May 8 13:15 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 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 May 6 21:43 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
做一个TomCat镜像
1.镜像文件 tomcat压缩包,jdk压缩包
2.编写dockerfile 文件
官方命名:Dockerfile,build时就不用加-f ,会自动寻找Dockerfile
[root@os7master tomcatapps]# vi Dockerfile
FROM centos
MAINTAINER citygis<citygis@m.com>
COPY readme.txt /usr/localreadme.txt
ADD jdk-8u201-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.45.tar.gz /uer/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools/jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.45
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.45
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.45/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.45/bin/logs/catalina.out
#构建镜像
[root@os7master tomcatapps]# docker build -t mytomcat .
#查看镜像
[root@os7master tomcatapps]# docker images
#启动,挂载tomcat webapps 和logs日志
[root@os7master tomcatapps]# docker run -d -p 9090:8080 --name mytomcat -v /home/build/tomcat/test:/usr/local/apache-tomcat-9.0.45/webapps/test -v /home/build/tomcat/logs/:/usr/local/apache-tomcat-9.0.45/webapps//logs mytomcat
b685011db9d4a5ff3b654e0ac216800730d9f420f23f2aea1b8162ef37d9b0f8
14.发布镜像
dockerhub
1.地址 :https://hub.docker.com/
2.登录账号
[root@os7master ~]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker 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@os7master ~]# docker login -u 用户名
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/#credentials-store
Login Succeeded #登录成功
3.提交镜像
docker push 镜像名:[TAG]
阿里云镜像服务
1.登录阿里云
2.找到容器镜像服务
3.创建命名空间
4.创建容器镜像
5.参考官方文档
15.Docker网络
理解Docker0
测试
三个网络
原理:
1.我们每启动一个docker容器,docker 就会给容器分配一个ip。我们只要安装了docker ,就会有一个网卡docker0(桥接模式,exth-pair技术)
2.每启动一个容器,就会多一对网卡
exth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连,正因为有这个特性exth-pair充当一个桥梁,连接各种虚拟网络设备。docker容器之间的连接,都是使用exth-pair技术连接的。
3.结论:容器和容器之间是可以ping通的。
结论:tomcat01 和 tomcat01是共用的一个路由器。所有的容器在不指定网络的情况下,都是docker0来路由的,docker会给我们的容器分配一个默认的可用ip;
小结
docker使用的是Linux桥接,宿主机中是一个Docker 容器的网桥 docker0
docker 中的所有的网络接口都是虚拟的,虚拟的转发效率高。
只要容器删除,对应的网桥就没了。
16.容器互联 --link
docker exec -it tomcat01 ping tomcat02
#ping不通
docker run -d -P --name tomcat03 --link tomcat02 tomcat
#通过--link tomcat03 和 tomcat02 可以ping通
#反向是不能ping通的(tomcat02 Ping tomcat03不能通)
原理:
# 查看tomcat03就是在在本地配置了tomcat02的配置
# 查看hosts 配置,在这里原理发现
# --link 本质就是在hosts配置中添加映射
[root@AlibabaECS ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 c2e5a8a29151
172.17.0.4 50b163f99e32
自定义网络
docker network ls
bridge :桥接 docker(默认,自己创建也是用bridge模式)
none :不配置网络,一般不用
host :和宿主机共享网络
container :容器网络连通(局限大)
# 我们直接启动的命令
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点:默认,域名不能访问,--link可以打通连接
# 我们可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 子网
# --gateway 192.168.0.1 网关
[root@AlibabaECS ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#自己的网络创建好后启动多个容器的名字是可以相互ping通的,因为自己创建的网络是修复了docker的缺陷的。
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
docker exec -it tomcat-net-01 ping tomcat-net-02
#不同的集群可以使用不同的网络,可以保证集群的安全和健康
网络联通
**connect **
# 测试打通 tomcat - mynet
[root@AlibabaECS ~]# docker network connect mynet tomcat01
# 连通之后就是将 tomcat01 放到了 mynet 网络下
# 一个容器两个ip地址
# 阿里云服务:公网ip 私网ip
结论:假设要跨网络操作别人,就需要使用docker network connect 连通!
17.部署redis集群
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个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
done
# 通过脚本运行六个redis
for port in $(seq 1 6);\
docker run -p 637${port}:6379 -p 1667${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
docker exec -it redis-1 /bin/sh #redis默认没有bash
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
docker搭建redis集群结束
18.SpringBoot打包Docker镜像
1.打包项目
2.编写Dockerfile
idea安装插件(选做步骤,可设置远程仓库)
创建Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","jar","/app/.jar"]
上传jar和Dockerfile到服务器
docker build -t springbootname .
docker -d -P --name name springbootname
结束
19.Docker Compose 安装
Docker Compose : 可以运行多个Docker容器,做批量容器的编排
- 官网:官网
Linux下安装
1.下载执行命令
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.授权
sudo chmod +x /usr/local/bin/docker-compose
3.验证
docker-compose --version
20.Docker Compose Yaml文件编写
docker-compose.yml
版本:向下兼容
# 3层
version:'3' #版本
services: #服务
service1: web
# docker 服务配置
service2: redis
#其他配置 网络、卷、全局规则
volumer:
network:
configs:
异常解决
hello word报错
docker: Error response from daemon: pull access denied for hello-word, repository does not exist or may require ‘docker login’: denied: requested access to the resource is denied.
解决办法:
新版的 Docker 使用 /etc/docker/daemon.json(Linux)来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
{
"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"]
}
重启
systemctl restart docker
再次输入 docker run hello-world
问题解决
docker run -d 镜像名 启动不起来
docker使用后台运行,就必须要有一个前台进程,docker发现没有应用就会自动停止;