Docker
介绍
Docker 是一个开源的应用容器引擎,基于Go语言 并遵从 Apache2.0 协议开源。
Docker解决问题
- 环境不一致,一致性
- 独立环境,隔离性
- 快速部署
安装
-
下载关于Dokcer的依赖环境
yum -y install yum-utils device-mapper-persistent-data lvm2 -
设置下载镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
安装docker
#我们在更新yum源或者出现配置yum源之后,通常都会使用yum makecache 生成缓存 yum makecache fast yum -y install docker-ce -
启动docker -- 设置开机启动 -- 测试
# 启动docker systemctl start docker # 设置开机启动 systemctl enable docker # 测试 docker run hello-world
Docker的中央仓库
-
Docker官方仓库:镜像全,速度慢
-
国内的镜像网站:网易蜂巢、daocloud。。。
-
公司私服
- 添加配置
# 需要在 /etc/docker/daemon.json 添加 { "registry-mirrors": ["http://registry.docker-cn.com"], "insecure-registries": ["ip:port"] } -
重启服务
# 重新加载配置文件 systemctl daemon-reload # 重启服务 systemctl restart docker
镜像
# 拉取镜像到本地
docker pull 镜像名称[:tag]
# 拉取tomcat
docker pull daocloud.io/library/tomcat:8.5.15-jre8
# 查看本地镜像
docker images
# 删除本地镜像
docker rmi 镜像标识(IMAGE ID)
镜像导入导出
# 导出本地docker
docker save -o 保存路径 镜像标识
# 导入本地镜像
docker load -i 本地镜像地址
# 修改镜像名称
docker tag 镜像id 新镜像名称:版本
容器
运行容器
docker run 镜像标识|镜像名称[:tag]
# 常用参数
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像标识|镜像名称[:tag]
# -d 代表后台运行容器
# -p 宿主机端口:容器端口 为了映射当前linux的端口和容器的端口
# --name 容器名称 指定容器名称
查看容器
docker ps [-qa]
# -a 查看全部容器,包括没有运行的容器
# -q 只查看容器的标识
查看容器日志
docker logs -f 容器id
# -f 可以滚动查看日志的最后几行
进入容器内部
docker exec -it 容器id bash
删除容器
删除容器前需要先关闭容器
# 停止指定容器
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
启动容器
docker start 容器id
Docker的应用
1.准备工程war包
2.准备MySql容器
# 运行MySql容器
# -e MYSQL_PASSWORD=root 设置mysql root用户默认密码
docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root daocloud.io/library/mysql:5.7.4
3.准备Tomcat容器
# 运行Tomcat容器 之前已经下载tomcat
docker run -d -p 8081:8080 --name tomcat id标识
# 将war包复制到Tomcat容器里(复制到webapps下)
docker cp 文件名称 容器id:容器内部位置
数据卷 volume
Q: 什么是数据卷?
A: 数据卷可以将宿主机的一个目录映射到容器内部的一个目录
Q: 为什么要使用数据卷
A: 在容器内部维护困难,使用数据卷可以在宿主机中操作目录中的内容
创建数据卷
# 创建数据卷
docker volume create 数据卷名称
# 创建之后默认存放在 /var/lib/docker/volumes/数据卷名称/_data
# 查看数据卷的详细信息
docker volume inspect 数据卷名称
# 查看所有数据卷的详细信息
docker volume ls
# 删除数据卷
docker vloume rm 数据卷名称
应用数据卷
当你映射数据卷时,如果数据卷不存在。docker会自动创建
# 该方法会将容器内部自带的文件 存放到默认存放路径
docker run -v 数据卷名称:容器内部路径 镜像id
指定一个路径作为数据卷的存放位置(推荐使用)
# 该方法则不会讲容器内部自带文件拉出去 所以该路径是空的
docker run -v 路径:容器内部路径 镜像id
error: IPv4 forwarding is disabled. Networking will not work.
在宿主机上执行 echo "net.ipv4.ip_forward=1" >> /usr/lib/sysctl.d/00-system.conf
重启network和docker服务 systemctl restart network systemctl restart docker
Docker volume 清理
docker volume prune删除所有未使用的卷
自定义镜像
-
创建一个Dockerfile文件,指定自定义镜像信息
Dockerfile中常用的内容
-
from:指定当前自定义镜像依赖环境
-
maintainer:维护者信息
-
copy:将相对路径下的内容复制到自定义镜像中
-
workdir:声明镜像默认工作目录
-
run:构建镜像时执行的命令
-
add:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
-
cmd:需要执行的命令(在workdir下执行,可以写多个但只以最后一个为准),构建容器后调用,也就是在容器启动时才进行调用
-
entrypoint:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。
-
label:用于为镜像添加元数据。使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
LABEL version="1.0" description="这是一个Web服务器" -
env:设置环境变量
ENV myName John Doe ENV myDog Rex The Dog ENV myCat=fluffy
如
from daocloud.io/library/tomcat:8.5.15-jre8 # ssm.war 需要放在当前路劲下 copy ssm.war /usr/local/tomcat/webapps # 暂时不用 workdir cmd -
-
将准备好的Dockerfile文件,使用Docker命令制作镜像
docker build -t 镜像名称:[tag] Dockerfile路径
Dockerfile定义多镜像tomcat+mysql自动导入数据库
mysql镜像启动时会执行/docker-entrypoint-initdb.d目录下的.sh、.sql、.sql.gz文件
注意:不是所有版本的mysql镜像都支持这样做
亲测5.7可以使用,5.7.4不可使用
如果不能自动导入库
可使用docker commit命令导出有数据的mysql容器 做镜像
Dockerfile
FROM daocloud.io/library/tomcat:8.5.15-jre8 as tfd-tomcat
COPY tfd.war /usr/local/tomcat/webapps
FROM mysql:5.7 as tfd-mysql
ENV MYSQL_ROOT_PASSWORD=root
ENV TZ=Asia/Shanghai
ENV sqlFile=tfd.sql
ENV sqlPath=/mysql
ENV shFile=setup.sh
RUN mkdir -p $sqlPath
COPY $sqlFile $sqlPath
COPY $shFile /docker-entrypoint-initdb.d
RUN chmod a+x /docker-entrypoint-initdb.d/$shFile
setup.sh
#!/bin/bash
set -e
mysql -uroot -p$MYSQL_ROOT_PASSWORD <<EOF
source /$sqlPath/$sqlFile;
EOF
构建镜像
docker build -t tfd-tomcat --target tfd-tomcat .
docker build -t tfd-mysql --target tfd-mysql .
运行
docker run -d -p 8080:8080 --name tfd-tomcat tfd-tomcat
docker run -d -p 3306:3306 --name tfd-mysql tfd-mysql
Docker-Compose
运行一个镜像,需要添加大量的参数
可以通过Docker-Compose编写这些参数
Docker-Compose可以帮助我们批量的管理容器
只需要通过 docker-compose.yml 文件去维护
下载Docker-Compose
- 去github官网搜索docker-compose 链接,这里使用 1.24.1版本
- 修改DockerCompose文件的名称(方便使用)
- 给DockerCompose文件添加可执行权限
- 配置环境变量 (方便使用)
- 测试
# 改名
mv docker-compose-Linux-x86-64 docker-compose
# 加权限 需要可执行权限
chmod 777 docker-compose
# 加环境变量
# 移动到目录a
mv docker-compose 目录a
vi /etc/profile
# 添加 export PATH=目录a:$PATH 或者 修改原有的环境
source /etc/profile
# 测试
# 在任意目录下 输入docker-compose
使用Docker-Compose管理容器
compose 撰写、组成、构成、编写
使用Docker-Compose管理MySQL和Tomcat容器
不同docker-compose版本的yml配置文件书写格式不一样
注意在docker-compose.yml文件中,不要使用制表符
version: '3.1'
services:
# 服务名称
mysql:
# 代表docker启动,这个容器会一起启动
restart: always
# 指定镜像路径
image: daocloud.io/library/mysql:5.7.4
# 指定容器名称
container_name: mysql
ports:
- 3306:3306
environment:
# 指定Mysql的ROOT用户密码
MYSQL_ROOT_PASSWORD: root
# 指定时区
TZ: Asia/Shanghai
# 映射数据卷
volumes:
- /opt/docker/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:
- /opt/docker/tomcat_webapps:/usr/local/tomcat/webapps
- /opt/docker/tomcat_logs:/usr/local/tomcat/logs
使用docker-compose.yml管理自定义镜像
version: '3.1'
services:
tfd-mysql:
restart: always
image: tfd-mysql:latest
container_name: tfd-mysql
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
TZ: Asia/Shanghai
volumes:
- /usr/docker/volumes/mysql_data:/var/lib/mysql
tfd-tomcat:
restart: always
image: tfd-tomcat:latest
container_name: tfd-tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
volumes:
- /usr/docker/volumes/tomcat_logs:/usr/local/tomcat/logs
使用docker-compose命令管理容器
使用docker-compose命令时,默认会在当前目录下找docker-compos.yml文件
docker-compose常用命令
# 基于docker-compose.yml启动管理容器
# 参数: -d 后台启动
docker-compose up -d
# 关闭+删除容器
docker-compose down
# 开启/关闭/重启 已经存在的 由docker-compose 维护的容器
docker-compose start
docker-compose stop
docker-compose restart
# 查看由docker-compose管理的容器
docker-compose ps
# 查看日期
# 参数:-f 滚动监控
docker-compose logs -f
使用docker-compose配合Dockerfile使用
使用docker-compose.yml文件以及Dockerfile文件在生成自定义镜像同时启动当前镜像,并且由docker-compose去管理容器
docker-compose.yml
version: '3.1'
service:
ssm:
restart: always
# 构建自定义镜像
build:
# 指定自定义镜像路径
context: ../
# 指定文件名称
dockerfile: Dockerfile
image: ssm:1.0.1
container_name: ssm
ports:
- 8081:8080
environment:
TZ: Asia/Shanghai
Dockerfile
from daocloud.io/library/tomcat:8.5.15-jre8
copy ssm.war /usr/local/tomcat/webapps
自定义镜像须知
- 如果自定义镜像不存在
docker-compose up -d命令会自动构建 - 如果自定义镜像已经存在则直接使用这个镜像
- 如果需要重新构建该镜像,使用
docker-compose build或者docker-compose up -d --build
Docker容器导出成镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数说明;
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
example:docker commit -a "lx" -m "tfd-mysql" 9f tfd-mysql:1.0.1