文章目录
一、Docker背景
1.1 环境不一致
1.2 隔离性
1.3 弹性伸缩
1.4 学习成本
二、Docker介绍
2.1 Docker的由来
Docker主要作者-Solomon |
---|
![]() |
现在Solomon已经离开了维护Docker的团队 |
---|
![]() |
2.2 Docker的思想
三、Docker的安装
3.1 下载Docker依赖的环境
yum -y install yum-utils device-mapper-persistent-data lvm2
3.2 指定Docker镜像源
#查询dockers的版本
[root@qianfeng01 ~]# yum list docker-ce --showduplicates
#安装指定版本
yum -y install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7
#安装新版本
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.3 安装Docker
#制作缓存
yum makecache fast
#安装docker-ce
yum -y install docker-ce
3.4 Docker服务启停
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker
# 查看Docker服务状态
systemctl status docker
3.5 Docker容器运行解析
# 测试
[root@qianfeng01 ~]# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly. #上诉信息显示你的安装似乎正常工作。
To generate this message, Docker took the following steps: #为了生成这条消息,Docker执行以下步骤
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
#输出这段提示以后,hello world就会停止运行,容器自动终止
#docker: docker客户端
#run :创建并运行容器
#hello-world : 镜像名称
3.6 Docker运行流程解析
- 首先,我们在docker客户端(命令行终端窗口),执行docker命令;
- 客户端会去访问我们docker所在的那台服务器主机,实质而言主机上有一个Docker daemon主线程,它会监听到客户端的docker命令,它会run容器(Container),而容器又是通过镜像生成的。如果没有hello-world容器,它就会在本地查找hello-world镜像,如果本地找到了就会直接生成一个hello-world容器,否则,会向阿里云服务器仓库拉去相应的镜像;
- 从阿里云服务器仓库上拉取hello-world镜像到本地,再生成容器,进而运行。
3.7 Docker运行流程
Docker run运行流程:
四、Docker的中央仓库【重点
】
# 设置从哪个镜像源下载镜像
vi /etc/docker/daemon.json
# 设置从ustc下载镜像, 速度快
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
# 重启docker服务
systemctl restart docker
# 需要创建或修改/etc/docker/daemon.json,并添加如下内容,"ip:port"可以编写多个。
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["ip:port"]
}
# 注意事项
"registry-mirrors" 设置docker的私有仓库地址
"insecure-registries" 设置私有仓库地址可以设为http
可参考链接:https://blog.csdn.net/java_xinshou1/article/details/102620028
# 重启docker服务
systemctl restart docker
五、镜像的操作【重点
】
5.1 拉取镜像
docker pull 镜像名称[:tag]
# 举个栗子:docker pull daocloud.io/library/tomcat:8.5.15-jre8
5.2 查看本地全部镜像
docker images
5.3 删除本地镜像
docker rmi 镜像的标识 | 镜像名称:tag
docker rmi b8dfe9ade316
docker rmi daocloud.io/library/tomcat:8.5.15-jre8
5.4 镜像的导入导出
# 将本地的镜像导出
docker save -o 导出的路径 镜像id
doeker save -o /usr/local/helloworld.tar 18e5af790473
# 加载本地的镜像文件
docker load -i 镜像文件
docker load -i /usr/local/helloworld.tar
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本
docker tag 18e5af790473 myhelloworld:1.0
六、容器操作【重点
】
6.1 运行容器
# 简单操作
docker run 镜像的标识 | 镜像名称[:tag]
docker run b8dfe9ade316
docker run daocloud.io/library/tomcat:8.5.15-jre8
# 常用的参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识|镜像名称[:tag]
docker run -d -p 8090:8080 --name my_container b8dfe9ade316
# -d:代表后台运行容器
# -p 宿主机端口:容器端口:为了映射当前Linux的端口和容器的端口
# --name 容器名称:指定容器的名称
6.2 查看正在运行的容器
docker ps [-qa]
# -a:查看全部的容器,包括没有运行
# -q:只查看容器的标识
6.3 查看容器日志
docker logs -f 容器id
# -f:可以滚动查看日志的最后几行
6.4 进入容器内容部
docker exec -it 容器id bash
docker exec -it 容器名称 bash
6.5 容器与宿主机内容相互复制
#docker cp 文件名称 容器id:容器内部路径 复制进容器
[root@qianfeng01 ~]# docker container cp /home/Engineer.csv 020be3c0bed6:/home/
#docker cp 容器id:容器内部路径 文件名称 复制到宿主机
[root@qianfeng01 ~]# docker container cp 020be3c0bed6:/home/Engineer.csv /home/
6.6 重启&启动&停止&删除容器
# 重新启动容器
docker restart 容器id/容器name
# 启动停止运行的容器
docker start 容器id/容器name
# 停止指定的容器(删除容器前,需要先停止容器)
docker stop 容器id/容器name
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
七、Docker应用
7.1 Docker安装Tomcat
docker run -d -p 8080:8080 --name tomcat daocloud.io/library/tomcat:8.5.15-jre8
7.2 Docker安装MySQL
docker run -d -p 3366:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
# 宿主机中通过 3366连接 容器中的mysql
[root@localhost logs]# mysql -uroot -P 3366 -proot -h 192.168.1.135
八、数据卷 - 目录映射【重点
】
8.1 创建数据卷
docker volume create 数据卷名称
[root@qianfeng01 ~]# docker volume create dockerv1
8.2 查看数据卷详情
docker volume inspect 数据卷名称
[root@qianfeng01 ~]# docker volume inspect dockerv1
8.3 查看全部数据卷
docker volume ls
8.4 删除数据卷
docker volume rm 数据卷名称
8.5 容器映射数据卷
# 从新创建容器(推荐使用这种方式)
# docker run -d -it -p 宿主机端口:容器端口 --name=容器名字 -v 数据卷名字:映射的容器内部路径 镜像id
docker run -d -it -p 8080:8080 --name=tomcat -v ssm:/usr/local/tomcat/webapps b8dfe9ade316
# 通过路径映射数据卷
docker run -v 路径:容器内部的路径 镜像id
docker run -v /usr/local/tomcat_webapps2004:/usr/local/tomcat/webapps 镜像id
#安装时指定端口和数据卷映射案例
[root@qianfeng01 local]# mkdir -p /usr/local/mongodb/data /usr/local/mongodb/conf /usr/local/mongodb/log
#运行docker容器(没有则创建),无需密码验证
docker run \
-itd \
--name mongo \
-p 27017:27017 \
-v /usr/local/mongodb/data:/mongo/data \
-v /usr/local/mongodb/conf:/mongo/conf \
-v /usr/local/mongodb/log:/mongo/log \
mongo:4.4
docker run代表运行容器,没有就创建
-i: 允许你对容器内的标准输入 (STDIN) 进行交互
-t: 在新容器内指定一个伪终端或终端
-d: 在后台运行容器并打印containerID
--name: 指定容器名称
-p: 指定端口映射,即将容器的27107端口映射到本机27107
-v: 将本机的目录挂到容器内部/mongo/data目录
mongo:4.4:镜像名称
九、Dockerfile自定义镜像
9.1 Dockerfile定义
Dockerfile 是一个文本文件,其内包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile之后,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成镜像即可,省去了敲命令的麻烦。
9.2 Dockerfile文件格式
Dockerfile分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。
一开始必须要指明所基于的基础镜像名称,接下来一般会说明维护者信息,后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。
# 1、第一行必须指定 基础镜像信息
# 定制的镜像都是基于 FROM 的镜像,这里的ubuntu 就是定制需要的基础镜像。
# 后续的操作都是基于 nginx。
# FROM <image>:<tag>
FROM ubuntu
# 2、维护者信息
MAINTAINER docker_user docker_user@email.com
# 3、镜像操作指令
# RUN:用于执行后面跟着的命令行命令。 有以下俩种格式:
# shell 格式:RUN <命令行命令>
# exec 格式:RUN ["可执行文件", "参数1", "参数2"]
# 例如:RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 4、容器启动执行指令
CMD /usr/sbin/nginx
例如:
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。优化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
9.3 Dockerfile内容
from: 指定当前自定义镜像依赖的环境
copy: 将相对路径下的内容复制到自定义镜像中
workdir: 声明镜像的默认工作目录
run: 执行的命令,可以编写多个
cmd: 需要执行的命令(在workdir下执行的,cmd可以写多个,但是只以最后一个为准)
# 举个例子,制作SSM容器镜像,而且ssm.war要放在Dockerfile的同级目录下
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
9.4 通过Dockerfile制作镜像命令
docker build -t 镜像名称[:tag] .
9.5 简单Dockerfile案例
-
准备一个nginx的基础镜像。
docker pull library/ngnix
在镜像列表中会看到我们从远程仓库中获取的nginx镜像。
docker images | grep ngnix
-
准备好了基础镜像,编写Dockerfile
以定制 nginx 镜像为例,在一个空白目录中,建立一个文本文件,并命名为 Dockerfile。
mkdir mydocker cd mydocker touch Dockerfile
构建一个 Dockerfile 内容如下:
FROM nginx RUN echo '<h1>hello, docker!</h1>' > /usr/share/nginx/html/index.html
这个 Dockerfile 一共就两行涉及到了两条指令:FROM 和 RUN,FROM 表示获取指定基础镜像,RUN 执行命令,在执行的过程中重写了 nginx 的默认页面信息,将信息替换为:Hello, Docker!。
-
用Dockerfile 来构建镜像
在 Dockerfile 文件所在目录执行:
docker build -t nginx:v1 .
构建完成之后,使用 docker images 命令查看所有镜像,如果存在 REPOSITORY 为 nginx 和 TAG 是 v1 的信息,就表示构建成功。
docker images | grep nginx:v1 docker images nginx:v1
-
接下来使用 docker run 命令来启动容器
docker run --name docker_nginx_v1 -itd -p 80:80 nginx:v1
这条命令会用 nginx 镜像启动一个容器,命名为docker_nginx_v1,并且映射了 80 端口,这样我们可以用浏览器去访问这个 nginx 服务器。
-
测试镜像启动情况
访问刚启动的nginx容器。
curl 127.0.0.1
返回如下信息:
hello, docker!
,则表示成功。
至此,一个简单的Docker镜像就制作完成,并且能够通过镜像启动容器运行了。
十. Docker-Compose【重点
】
10.1 Compose概念与安装
-
**项目(Project):**由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
-
**服务(Service):**一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
docker compose运行目录下的所有yml文件组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务可包括多个容器实例。docker-compose就是docker容器的编排工具,主要就是解决相互有依赖关系的多个容器的管理。
10.1.1 下载Docker-Compose
官方文档地址:Install Docker Compose | Docker Documentation
[root@qianfeng01 install]# wget https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64
10.1.2 设置权限
[root@qianfeng01 install]# mv docker-compose-linux-x86_64 docker-compose
#授予执行权限
[root@qianfeng01 install]# chmod a+x ./docker-compose
10.1.3 移动到/usr/local/bin目录下
#创建软连接(相当于配置环境变量)
[root@qianfeng01 install]# ln -s /opt/install/docker-compose /usr/bin/docker-compose
#查看版本
[root@qianfeng01 install]# docker-compose version
Docker Compose version v2.5.0
10.1.4 测试
测试效果 |
---|
![]() |
10.2 Docker-Compose管理MySQL和Tomcat容器
- 创建compose演示目录
# 进入/usr/local目录
cd /usr/local/
# 创建演示compose目录
[root@localhost local]# mkdir -p compose/test
# 进入演示目录
[root@localhost local]# cd compose/test
# 创建compose演示文件
[root@localhost test]# touch docker-compose.yml
# 递归创建宿主机中的tomcat项目部署目录
[root@localhost test]# mkdir -p tomcat/webapps
# 递归创建宿主机中的tomcat日志目录
[root@localhost test]# mkdir -p tomcat/logs
- 粘贴下面已经写好的compose文件内容
version: '3.1'
services:
mysql: # 服务的名称
restart: always # 代表只要docker启动,那么这个容器就跟着一起启动
image: daocloud.io/library/mysql:5.7.4 # 指定镜像下载的路径
container_name: mysql # 指定容器名称
ports:
- 3306:3306 # 指定端口号的映射
environment:
MYSQL_ROOT_PASSWORD: root # 指定MySQL的ROOT用户登录密码
TZ: Asia/Shanghai # 指定时区
volumes:
- /opt/docker_mysql_tomcat/mysql_data:/var/lib/mysql # 映射数据卷
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5.15-jre8
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
volumes:
- /usr/local/compose/test/tomcat/webapps:/usr/local/tomcat/webapps
- /usr/local/compose/test/tomcat/logs:/usr/local/tomcat/logs
10.3 使用docker-compose命令管理容器
# 1. 基于docker-compose.yml启动管理的容器
docker-compose up -d
# 2. 关闭并删除容器
docker-compose down
# 3. 开启|关闭|重启已经存在的由docker-compose维护的容器
docker-compose start|stop|restart
# 4. 查看由docker-compose管理的容器
docker-compose ps
# 5. 查看日志
docker-compose logs -f