文章目录
- [1. 快速入门](#1. 快速入门)
-
- [1.1 配置Docker的yum库](#1.1 配置Docker的yum库)
- [1.2 安装docker](#1.2 安装docker)
- [1.3 启动和校验](#1.3 启动和校验)
- [1.4 安装MySQL](#1.4 安装MySQL)
- [1.5 常用命令](#1.5 常用命令)
- [2. Docker基础](#2. Docker基础)
-
- [2.1 常见命令](#2.1 常见命令)
- [2.2 数据卷](#2.2 数据卷)
- [2.3 本地目录挂载](#2.3 本地目录挂载)
- [2.4 自定义镜像](#2.4 自定义镜像)
-
- [2.4.1 镜像结构](#2.4.1 镜像结构)
- [2.4.2 Dockerfile](#2.4.2 Dockerfile)
- [2.4.3 构建镜像](#2.4.3 构建镜像)
- [2.5 网络](#2.5 网络)
- [3. 项目部署](#3. 项目部署)
-
- [3.1 DockerCompose](#3.1 DockerCompose)
-
- [3.1.2 基本语法](#3.1.2 基本语法)
- [3.1.2 基本命令](#3.1.2 基本命令)
参考文档链接: https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcucLZbrn2d
1. 快速入门
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image) 。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库 :存储和管理镜像的平台,Docker官方维护了一个公共仓库:DockerHub。
1.1 配置Docker的yum库
-
安装yum工具
bashsudo yum install -y yum-utils device-mapper-persistent-data lvm2
-
使用阿里云更新yum源
bashcurl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
-
清除yum
bashyum clean all
-
更新缓存
bashyum makecache
1.2 安装docker
bash
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.3 启动和校验
bash
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
1.4 安装MySQL
-
使用下面的命令来安装MySQL:
bashdocker run -d \ --name mysql-test \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ mysql:8.0.36
- docker run:创建并运行一个容器,-d 是让容器在后台运行
- --name mysql:给容器起个名字,必须唯一
- -p 3306:3306:设置端口映射 宿主机端口:容器端口
- -e KEY=VALUE:设置环境变量
- mysql:指定运行的镜像的名字 [repository]:[tag] 镜像名:镜像版本
-
此时,通过命令查看mysql容器:
bashdocker ps
1.5 常用命令
运行已创建的容器
bash
docker start mysql
停止正在运行的容器
bash
docker stop mysql
删除容器
bash
docker rm mysql
查看所有容器(包括已经停止的容器)
bash
docker ps -a
2. Docker基础
2.1 常见命令
Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:https://docs.docker.com/
bash
# 第1步,去DockerHub查看nginx镜像仓库及相关信息
# 第2步,拉取Nginx镜像
docker pull nginx
# 第3步,查看镜像
docker images
# 结果如下:
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
# 第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第6步,访问网页,地址:http://虚拟机地址
# 第7步,停止容器
docker stop nginx
# 第8步,查看所有容器
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 第9步,再次启动nginx容器
docker start nginx
# 第10步,再次查看容器
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
# 查看日志 -f持续跟踪
docker logs -f nginx
# 第11步,查看容器详细信息
docker inspect nginx
# 第12步,进入容器,查看容器内目录
docker exec -it nginx bash
# 或者,可以进入MySQL
docker exec -it mysql mysql -uroot -p
# 第13步,删除容器
docker rm nginx
# 发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
2.2 数据卷
数据卷(volume)是一个虚拟目录,是容器内目录 与宿主机目录 之间映射的桥梁
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看某个数据卷的详情 |
docker volume prune | 清除数据卷 |
在执行docker run
命令时,使用 -v数据卷:容器内目录 可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
-
创建数据卷
bashdocker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
bashdocker volume ls
-
查看数据卷详情
bashdocker volume inspect html
2.3 本地目录挂载
-
查看容器信息
bashdocker inspect mysql-test
-
在执行
docker run
命令时,使用**-v 本地目录:容器内目录** 可以完成本地目录挂载 -
本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
- -v mysql:/var/lib/mysql 会被识别为一个数据卷叫mysql
- -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录
参考过程:https://b11et3un53m.feishu.cn/wiki/R4Sdwvo8Si4kilkSKfscgQX0niB
2.4 自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
2.4.1 镜像结构
2.4.2 Dockerfile
由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可
Dockerfile 就是一个文本文件,其中包含一个个的指令(Instruction) ,用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
其对应的语法可以参考官方文档:https://docs.docker.com/engine/reference/builder/
例如,要基于Ubuntu镜像来构建一个Java应用,其Dockerfile内容如下:
bash
# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/usr/local
ENV TZ=Asia/Shanghai
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 设定时区
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 指定项目监听的端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]
有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像,就可以省去JDK的配置了:
bash
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
2.4.3 构建镜像
当编写好了Dockerfile,可以利用下面命令来构建镜像:
bash
docker build -t docker-demo:1.0 .
- docker build : 就是构建一个docker镜像
- -t docker-demo:1.0 :-t参数是指定镜像的名称(repository和tag)
- . : 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录:
2.5 网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上:
容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
通过自定义网络会建立新的网桥,加入自定义网络的容器才可以通过容器名互相访问
Docker的网络操作命令如下:
官方文档:
https://docs.docker.com/engine/reference/commandline/network/
命令 | 说明 |
---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
-
自定义网络
bash# 1.首先通过命令创建一个网络 docker network create hmall # 2.然后查看网络 docker network ls # 结果: NETWORK ID NAME DRIVER SCOPE 639bc44d0a87 bridge bridge local 403f16ec62a2 hmall bridge local 0dc0f72a0fbb host host local cd8d3e8df47b none null local # 其中,除了hmall以外,其它都是默认的网络 # 3.让dd和mysql都加入该网络,注意,在加入网络时可以通过--alias给容器起别名 # 这样该网络内的其它容器可以用别名互相访问! # 3.1.mysql容器,指定别名为db,另外每一个容器都有一个别名是容器名 docker network connect hmall mysql --alias db # 3.2.db容器,也就是我们的java项目 docker network connect hmall dd # 4.进入dd容器,尝试利用别名访问db # 4.1.进入容器 docker exec -it dd bash # 4.2.用db别名访问 ping db # 结果 PING db (172.18.0.2) 56(84) bytes of data. 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.070 ms 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.056 ms # 4.3.用容器名访问 ping mysql # 结果: PING mysql (172.18.0.2) 56(84) bytes of data. 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time=0.044 ms 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time=0.054 ms
3. 项目部署
3.1 DockerCompose
3.1.2 基本语法
Docker Compose通过一个单独的docker-compose.yml 模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署 。
如果用docker-compose.yml文件来定义,就是这样:
yaml
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
networks:
- new
networks:
new:
name: hmall
3.1.2 基本命令
基本语法如下:
bash
docker compose [OPTIONS] [COMMAND]
其中,OPTIONS和COMMAND都是可选参数,比较常见的有: