本文均学于“黑马程序员”
本文所用环境:CentOS7 、HeidiSQL 、MobaXterm、MySQL
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。
Docker分为如下三个概念:
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl enable docker //设置开机自启
systemctl start docker //开启Docker
docker ps
这里使用阿里云镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
这里以MySQL为例进行部署
在CentOS下执行如下命令:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
其中:
docker run -d
:创建并运行一个容器,-d则是让容器以后台进程运行
--name mysql
: 给容器起名字叫mysql
-p 3306:3306
: 设置端口映射
-e TZ=Asia/Shanghai
: 配置容器内进程运行时的一些参数
MYSQL_ROOT_PASSWORD=123456
:是设置MySQL默认密码
mysql
: 设置镜像名称,Docker会根据这个名字搜索并下载镜像
以下以nginx
为例,使用MobaXterm
对CentOS进行远程操控
docker pull nginx
docker images
docker save -o nginx.tar nginx
docker rmi nginx:latest //:latest表示为最新的
docker load -i nginx.tar
docker run -d --name nginx -p 80:80 nginx //第一个nginx为容器名 第二个为依赖的镜像
docker ps //正常查看
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" //格式化查看
// 浏览器输入
http://192.168.80.130:80
docker stop nginx
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
docker start nginx
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
docker inspect nginx
docker exec -it nginx bash
exit
docker rm nginx
docker rm -f nginx //强制删除
vi /root/.bashrc //修改/root/.bashrc文件
//例如:
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'
source /root/.bashrc //使别名生效
数据卷(volume) 是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
/var/lib/docker/volumes
这个目录就是默认的存放所有容器数据卷的目录,其下再根据数据卷名称创建新目录,格式为/数据卷名/_data
操作演示
docker rm -f nginx
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
docker volume ls
docker volume inspect html
/var/lib/docker/volumes/html/_data
目录ll /var/lib/docker/volumes/html/_data
cd /var/lib/docker/volumes/html/_data
vi index.html
// 例如:将第十二行改为" Welcome to 比特冬哥!
"
// 浏览器输入
http://192.168.80.130:80
docker exec -it nginx bash
cd /usr/share/nginx/html
ls
docker inspect mysql
可以发现这个容器声明了一个本地目录,需要挂载数据卷,但是数据卷未定义。这就是匿名卷。
可以发现,其中有几个关键属性:
Name
:数据卷名称。由于定义容器未设置容器名,这里的就是匿名卷自动生成的名字,一串hash值。Source
:宿主机目录Destination
: 容器内的目录docker rm -f mysql
cd ~
mkdir mysql
cd mysql
mkdir data
mkdir conf
mkdir init
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123456 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
mysql
dps
ls -l data
docker exec -it mysql mysql -uroot -p //mysql -uroot -p为进入容器后执行的指令
show variables like "%char%"; //发现编码是utf8mb4没有问题
自定义镜像本质就是依次准备好程序运行的基础环境、依赖、应用本身、运行配置等文件,并且打包
由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docker就提供了自动打包镜像的功能。我们只需要将打包的过程,每一层要做的事情用固定的语法写下来,交给Docker去执行即可。而这种记录镜像结构的文件就称为Dockerfile
这里已提前获取构建镜像需要的基础镜像包
Dockerfile文件内容如下:
# 基础镜像
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"]
docker load -i jdk.tar
dis
cd demo/
docker build -t docker-demo .
命令说明:
docker build
: 就是构建一个docker镜像
-t docker-demo
:-t参数是指定镜像的名称(repository和tag)
.
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.代表当前目录,也可以直接指定Dockerfile目录
dis
docker run -d --name dd -p 8090:8090 docker-demo //dd为容器名 docker-demo为镜像
dps
用于解决不同容器之间的通信
docker network create bit_dong //bit_dong为网络名
docker network ls
dps
docker network connect bit_dong mysql //mysql和dd为容器名
docker network connect bit_dong dd
docker exec -it dd bash
ping mysql
docker run -d --name dd -p 80:80 --network bit_dong mysql
Docker Compose可以帮助实现多个相互关联的Docker容器的快速部署。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
docker-compose文件中可以定义多个相互关联的应用容器,每一个应用容器被称为一个服务(service)。由于service就是在定义某个应用的运行时参数,因此与docker run参数非常相似。
例如,用docker run部署MySQL的命令如下:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
--network hmall
mysql
如果用docker-compose.yml文件来定义,则为:
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
docker compose [OPTIONS] [COMMAND]
其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
以下是“黑马程序员”提供的docker-compose.yml文件
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"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall