目录
[五、Docker Compose](#五、Docker Compose)
参考视频:
https://www.bilibili.com/video/BV14WtLeDEit
一、Docker的安装
使用本机虚拟机或云平台
国内常见云平台:阿里云、腾讯云、华为云、青云......
使用CentOS 7.9
bash
# 移除旧版本docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 配置docker yum源。
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装 最新 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动& 开机启动docker; enable + start 二合一
systemctl enable docker --now
# 配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.m.daocloud.io"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
二、Docker的命令
bash
#查看运行中的容器
docker ps
#查看所有容器
docker ps -a
#搜索镜像
docker search nginx
#下载镜像
docker pull nginx
#下载指定版本镜像
docker pull nginx:1.26.0
#查看所有镜像
docker images
#删除指定id的镜像
docker rmi e784f4560448
#运行一个新容器
docker run nginx
#停止容器
docker stop keen_blackwell
#启动容器
docker start 592
#重启容器
docker restart 592
#查看容器资源占用情况
docker stats 592
#查看容器日志
docker logs 592
#删除指定容器
docker rm 592
#强制删除指定容器
docker rm -f 592
# 后台启动容器
docker run -d --name mynginx nginx
# 后台启动并暴露端口
docker run -d --name mynginx -p 80:80 nginx
# 进入容器内部
docker exec -it mynginx /bin/bash
# 提交容器变化打成一个新的镜像
docker commit -m "update index.html" mynginx mynginx:v1.0
# 保存镜像为指定文件
docker save -o mynginx.tar mynginx:v1.0
# 删除多个镜像
docker rmi bde7d154a67f 94543a6c1aef e784f4560448
# 加载镜像
docker load -i mynginx.tar
# 登录 docker hub
docker login
# 重新给镜像打标签
docker tag mynginx:v1.0 leifengyang/mynginx:v1.0
# 推送镜像
docker push leifengyang/mynginx:v1.0
Docker命令实验
接下来尝试做一个简单实验来熟悉docker命令!
实验要求如下:
启动一个nginx,并将它的首页改为自己的页面,发布出去,让所有人都能使用。
实验步骤:
下载镜像------> 启动容器------> 修改页面------> 保存镜像------> 分享社区
1.下载镜像
查看有没有这个镜像
下载镜像
查看是否下载成功
2.启动容器
启动nginx容器
但是这样启动会让会话的输入窗口阻塞,无法再在当前会话窗口中输入命令,那有没有更好的启动方式呢?有的兄弟,有的。
以下命令启动,可以实现后台启动 ,并给启动的容器自定义容器名 ,同时将容器内部的端口与宿主机的端口建立映射关系(宿主机外部的网络可以通过宿主机的端口访问到容器内部的应用程序):
3.修改页面
先进入容器内部
修改页面内容
原页面如下:
修改后的页面如下:
4.保存镜像
将修改好后的镜像进行"提交"操作
将镜像进行"保存"操作,如保存成一个文件
如果你拿到别人给的镜像tar包,该如何加载该镜像呢?------使用"加载"操作
5.分享社区
这一步需要登录dockerHub的账号并进行推送,在此不做演示。
三、Docker存储
掌握目录挂载、数据卷,让容器数据不再丢失。
1.目录挂载
在上面的实验中,有一个要求是修改nginx的首页页面,上面的做法是使用"docker exec"命令进入容器内部进行修改,但是这种做法还是过于麻烦。而且,如果该容器暴毙,再重新启动一个新的容器,那么之前那个容器运行的数据也就丢失了。
可以使用"-v"命令来将容器的部分文件挂载到外部,这样修改外部的文件就相当于修改容器内部的文件的了。
2.卷映射
使用"目录挂载"的方式,挂载的文件或目录是空的,需要自己添加内容,这样的方式不适合挂载配置文件。因为配置文件我希望它先继承原先的配置文件,我再进行部分修改。如果要实现这样的需求,就可以通过"卷映射"来实现。
这是"目录挂载"和"卷映射"命令的区别,目录挂载的位置要以"/"开头,而卷映射不需要。
这是卷映射中卷的默认存放地址。
四、Docker网络
1.容器间相互访问
docker在创建容器后,都会默认让容器加入docker0网络,并为每个容器分配唯一ip,使用容器ip+容器端口可以相互访问,注意ip由于各种原因可能会变化。
但是这样的话,如果要互相访问,还需要特地去查一下目的容器的ip,略显麻烦,能不能使用域名的方式呢?这样就不需要去查询ip了,域名可以直接使用容器名。
有的,这样的方法就是创建自定义网络(如上图创建了一个自定义网络叫mynet),在创建容器的命令中加入设置容器网络的部分命令即可,这样容器名就是稳定域名。
2.Redis主从同步集群
bash
#自定义网络
docker network create mynet
#主节点
docker run -d -p 6379:6379 \
-v /app/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis01 \
bitnami/redis
#从节点
docker run -d -p 6380:6379 \
-v /app/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \
-e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
--network mynet --name redis02 \
bitnami/redis
3.启动MySQL
bash
docker run -d -p 3306:3306 \
-v /app/myconf:/etc/mysql/conf.d \
-v /app/mydata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0.37-debian
五、Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具,通过一个 YAML 文件来配置应用程序的服务、网络和卷,然后使用单个命令即可创建和启动所有服务。
1.命令式安装
bash
#创建网络
docker network create blog
#启动mysql
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=wordpress \
-v mysql-data:/var/lib/mysql \
-v /app/myconf:/etc/mysql/conf.d \
--restart always --name mysql \
--network blog \
mysql:8.0
#启动wordpress
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456 \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress:/var/www/html \
--restart always --name wordpress-app \
--network blog \
wordpress:latest
2.compose.yaml
bash
name: myblog
services:
mysql:
container_name: mysql
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=wordpress
volumes:
- mysql-data:/var/lib/mysql
- /app/myconf:/etc/mysql/conf.d
restart: always
networks:
- blog
wordpress:
image: wordpress
ports:
- "8080:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_USER: root
WORDPRESS_DB_PASSWORD: 123456
WORDPRESS_DB_NAME: wordpress
volumes:
- wordpress:/var/www/html
restart: always
networks:
- blog
depends_on:
- mysql
volumes:
mysql-data:
wordpress:
networks:
blog:
增量更新:
修改 Docker Compose 文件。重新启动应用。只会触发修改项的重新启动。
数据不删:
默认就算down了容器,所有挂载的卷不会被移除。比较安全。