目录
1. 初识Docker
我们写好的代码会接触到好几个环境:开发环境、测试环境和生产环境。
容器中包括“环境+war包”(一起发给测试人员)—— 不会出现因环境不同而出现问题。
1.1 Docker概念
Docker是一个开源的应用容器引擎(诞生于2013,基于Go语言实现)。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上。
容器是完全使用沙箱机制,相互隔离。
容器性能开销极低。
Docker从17.03版本之后分为CE(Community Edition:社区版)和EE(Enterprise Edition:企业版)
小结:docker是一种容器技术,用于解决软件跨环境迁移的问题。
1.2 安装& 卸载Docker
(参考小编文章:【CentOS 7.0】安装与卸载Docker_zqq_2016的博客-CSDN博客)
1.3 Docker架构(docker以守护进程的方式存在)
镜像(Image):Docker镜像(Image),就相当于是一个root文件系统。比如官方镜像Ubuntu16.04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
容器(Container):镜像和容器的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除和暂停等。
仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
1.4 配置Docker镜像加速器
(参考:【CentOS 7.0】配置免费阿里云Docker镜像加速器_qqz_2016的博客-CSDN博客)
默认情况下,将来从docker hub(https://hub.docker.com/)上下载docker镜像,太慢,一般都会配置镜像加速器。
- USTC:中科大镜像加速器(https://docker.mirrors.ustc.edu.cn)
- 阿里云
- 网易云
- 腾讯云
2. Docker命令(16个)
2.1 Docker服务相关命令(5个)
2.1.1 启动docker服务
systemctl start docker
2.1.2 停止docker服务
systemctl stop docker
2.1.3 重启docker服务
systemctl restart docker
2.1.4 查看docker服务状态
systemctl status docker
2.1.5 开机启动docker服务
systemctl enable docker
2.2 Docker镜像相关命令(4个)
2.2.1 查看镜像
sudo docker images
2.2.2 搜索镜像
sudo docker search xxx(如:sudo docker search redis)
2.2.3 拉取镜像(若未指定版本,则TAG默认为latest)
sudo docker pull xxx(下载xxx)/ sudo docker pull xxx:版本号(如:sudo docker pull redis或sudo docker pull redis:5.0)
2.2.4 删除镜像
sudo docker rmi 镜像id
2.3 Docker容器相关命令(7个)
2.3.1 查看容器
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(Up:正在运行,Exited:已退出)
2.3.2 创建并启动容器(创建容器)
sudo docker run -it --name=c1 redis:5.0 /bin/bash # 创建并启动容器
sudo docker run 参数(如:sudo docker run -it --name=c1 redis:5.0 /bin/bash)
-i:保持容器运行。通常与-t同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。
-t:为容器重新分配一个伪输入终端,通常与-i同时使用。
-d:以守护(后台)模式运行容器,创建一个容器在后台运行,需要使用docker exec进入容器。退出后,容器不会关闭。
-it:创建的容器一般称为交互式容器,-id创建的容器一般称为守护式容器。
--name:为创建的容器命名。
sudo docker run -id --name=c3 redis:5.0 # 创建容器(名称为c3)
2.3.3 进入容器(注意:使用exec进入容器,退出(exit)后,容器不会关闭)
sudo docker exec -it c3 /bin/bash # 进入名称为c3的容器中
2.3.4 启动容器
sudo docker start 容器名称
2.3.5 停止容器
sudo docker stop 容器名称
2.3.6 删除容器(注意:启动的容器是不能被删除的,需要停止容器才能删除成功)
sudo docker rm 容器id或容器名称
sudo docker rm `sudo docker ps -aq` #删除所有容器,其中sudo docker ps -aq是查看所有容器的id
2.3.7 查看容器信息
sudo docker inspect 容器名称
3. Docker容器的数据卷
3.1 数据卷概念及作用
思考:
1)Docker容器删除后,在容器中产生的数据也会随之销毁?
2)Docker容器和外部机器可以直接交换文件吗?
3)容器之间想要进行数据交互?
数据卷:① 数据卷是宿主机中的一个目录或文件;② 当容器目录和数据卷目录绑定后,对方的修改会立即同步;③ 一个数据卷可以被多个容器同时挂载;④ 一个容器也可以被挂载多个数据卷。
数据卷作用:① 容器数据持久化(删除容器中的目录data_container后,再重新挂载到恢复的data_container容器目录,原来的数据还在);② 外部机器间接通信;③ 容器之间数据交换。
3.2 配置数据卷
3.2.1 设置数据卷(创建启动容器时,使用-v参数设置数据卷)
sudo docker run ... -v 宿主机目录(文件):容器内目录(文件)...
- 注意事项:① 目录必须是绝对路径;② 如果目录不存在,会自动创建;③ 可以挂载过个数据卷。
sudo docker run -it --name c2 -v /home/data:/root/data_container redis:5.0 /bin/bash
注意:完成配置数据卷之后,即可实现在/home/data和容器中的/root/data_container中数据的共享和同步(如:只在/home/data目录下创建一个txt文本,此时查看/root/data_container目录有一个一样的txt文本)。
3.2.2 一个容器被挂载多个数据卷
sudo docker run -it --name c3 -v /home/data1:/root/data1 -v /home/data2:/root/data2 redis:5.0 /bin/bash
或
sudo docker run -it --name c3 \ (其中\表示命令还没有写完)
-v /home/data1:/root/data1 \
-v /home/data2:/root/data2 \
redis:5.0 /bin/bash
或
sudo docker run -it --name c3 -v /home/data1:/root/data1 -v /home/data2:/root/data2 redis:5.0 (注意:如果在最后不写/bin/bash,还需要执行下边两个命令;如果在最后写了/bin/bash,则不需要执行下边两个命令,推荐在最后写上/bin/bash)
sudo docker start c3
sudo docker exec -it c3 /bin/bash
注意:容器c3的/root下有data1目录和data2目录,其中容器c3的/root/data1目录跟宿主机的/home/data1目录实现数据的共享和同步;容器c3的/root/data2目录跟宿主机的/home/data2目录实现数据的共享和同步。
3.2.3 一个数据卷被多个容器同时挂载
sudo docker run -it --name c4 -v /home/data:/root/data redis:5.0 /bin/bash
sudo docker run -it --name c5 -v /home/data:/root/data redis:5.0 /bin/bash
注意:容器c4和容器c5的/root/data目录和宿主机的/home/data目录实现数据共享和同步。
3.3 配置数据卷容器
多容器进行数据交换:
1)多个容器挂载同一个数据卷(麻烦)
2)数据卷容器(推荐)
(1)创建启动c3数据卷容器,使用-v参数设置数据卷
sudo docker run -it --name c3 -v /volume redis:5.0 /bin/bash
(2)创建启动c1、c2容器,使用-volumes-from参数设置数据卷
sudo docker run -it --name c1 --volumes-from c3 redis:5.0 /bin/bash
sudo docker run -it --name c2 --volumes-from c3 redis:5.0 /bin/bash
小结:
(1)数据卷概念:宿主机的一个目录或文件
(2)数据卷作用:① 容器数据持久化;② 客户端和容器数据交换;③ 容器间数据交换。
(3)数据卷容器:① 创建一个容器,挂载一个目录,让其他容器继承自该容器(--volumes-from);② 通过简单方式实现数据卷配置。
4. Docker应用部署
4.1 MySQL部署
需求:在Docker容器中部署MySQL,并通过外部MySQL客户端操作MySQL Server。
实现步骤:① 搜索MySQL镜像;② 拉取MySQL镜像;③ 创建容器;④ 操作容器中的mysql。
问题:
① 容器内的网络服务和外部机器不能直接通信;
② 外部机器和宿主机可以直接通信;
③ 宿主机和容器可以直接通信。
④ 当容器中的网络服务需要被外部机器访问时,可以将容器中提供服务的端口映射到宿主机的端口上,外部机器访问宿主机的该端口,从而间接访问容器的服务。
⑤ 这种操作称为:端口映射。
4.1.1 搜索MySQL镜像
sudo docker search mysql
4.1.2 拉取mysql镜像 (网址:Docker Hub,搜索MySQL镜像,查看MySQL版本;注意:需要先注册账号)
sudo docker pull mysql:5.7 #格式:sudo docker pull mysql:版本号
4.1.3 创建容器,设置端口映射,目录映射
# 在/root目录下创建mysql目录用于存储mysql数据信息
mkdir ~/mysql
cd ~/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.7
参数说明:
-p 3307:3306:将容器的3306端口映射到宿主机的3307端口
-v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的conf/my.conf挂载到容器的/etc/mysql/my.conf。 配置目录
-v $PWD/logs:/logs:将主机当前目录下的logs目录挂载到容器的/logs。 日志目录
-v $PWD/data:/var/lib/mysql:将主机当前目录下的data目录挂载到容器的/var/lib/mysql。
数据目录
-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
4.1.4 操作容器中的mysql
docker exec -it c_mysql /bin/bash //进入容器
mysql -uroot -p123456 //进入mysql
…… 命令行操作mysql
4.2 Tomcat部署
4.2.1 创建容器,设置端口映射、目录映射
docker pull tomcat:jdk8-corretto
mkdir ~/tomcat
cd ~/tomcat
docker run -id --name c_tomcat \
-p 8080:8080 \
-v $PWD:/usr/local/tomcat/webapps \
tomcat:jdk8-corretto
参数说明:
-p 8080:8080:将容器的8080端口映射到宿主机的8080端口
-v $PWD:/usr/local/tomcat/webapps:将主机中当前目录挂载到容器的webapps