卸载
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
systemctl enable docker
systemctl start docker
配置镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://n656a96c.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
数据卷实现容器与宿主机数据共享的问题,镜像启动时指定数据卷;
docker run [-v :ro] 容器名/id
-v 宿主机路径:容器内路径
# 别名:指定启动前已创建的数据卷
-v 别名:容器内路径
:ro ReadyOnly 容器内只读,只能有宿主机操作
数据卷相关命令
docker volume list # 查看数据卷
docker volume create 数据卷名 # 创建数据卷
docker volume inspect 数据卷名 # 数据卷信息
docker volume rm 数据卷名 # 删除数据卷
docker volume inspect 数据卷名 # 容器卷详情
[
{
"CreatedAt": "2022-09-03T14:54:23+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/aaa/_data",
"Name": "aaa",
"Options": null,
"Scope": "local"
}
]
高级网络配置
当Docker启动时,会自动在宿主机上创建一个docker0的虚拟网桥,实际上是Linux的一个birdge,可以理解为一个软件交换机,他会在挂载到它的网口进行转发。当创建一个Docker容器时,同时会创建一对veth pair接口(当数据包发送到一个接口时,另外一个接口时也是可以收到相同的数据包,这就是为什么通过-p命令可以实现宿主机与容器之间的端口通信)。容器端即eth0,则另一个是本地挂载在docker0网桥,名称以veth0开头,通过这种方式,主机可以跟容器之间通信,容器之间也可以通信。
使用自定义网络桥段后,在容器内部依然可以互通,而且还可以通过容器名称来当做ip使用。
docker run [--network] 容器名/id # --network # 指定网络桥段名称
安装
curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# 国内源
curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 安装
mv docker-compose-Linux-x86_64 docker-compose # 重命名
mv docker-compose /usr/local/bin # 移动至bin
[root@iZbp18eahm3m5nczl60fo4Z bin]# docker-compose --version
docker-compose version 1.25.5, build 8a1c60f6
# 卸载
rm -rf /usr/local/bin/docker-compose
docker-compose.yml
services
下面开始配置项目所需要的应用容器(第一个是容器的id,针对于这个项目的服务容器id)container_name
容器名(docker ps 中显示的容器)image
基于什么镜像ports
端口映射volumes
与宿主机的数据卷command
容器启动后指定执行的命令restart: always
应用重启后自启depends_on
配置容器服务加载顺序build
自定义构建镜像来(不能与image共存)
context
指定Dockerfile文件所在的上下文dockerfile
Dockefile文件名arg
Dockerfile文件中参数.env文件
docker-compose编排模板中有一些密码或者常量信息可以通过外部的.env文件来进行管理,因为当前文件是.开头隐藏文件,所以一般是看不到,使用ll -a
命令可以看到,格式 key = value
、在docker-compose.yml中可以通过${TOMCAT_VERSION}
来引入。
基本命令
docker-compose up -d [service] 后台启动容器编排文件
docker-compose down 此命令后停止up命令所启动的容器,并移除网络
docker-compose exec [service] 入指定容器
docker-compose ps [service] 列出项目中所有的容器
docker-compose restart [service] 重启项目中容器
docker-compose rm -f [service] 删除项目中所有容器
docker-compose start [service] 启动项目中容器(或指定容器)
docker-compose stop [service] 暂停项目中容器(或指定容器)
nginx+rabbitmq+mysql+redis+自定义镜像shop-api
version: '3.3'
# 具体服务
services:
nginx:
container_name: "nginx"
image: "nginx"
# 开机重启
restart: always
# 网段
networks:
- shop
ports:
- "80:80"
volumes:
# 数据挂载、配置文件挂载、日志信息挂载
- /usr/local/docker/nginx/config/nginx.conf:/etc/nginx/nginx.conf
- /usr/local/docker/nginx/html:/usr/share/nginx/html
- /usr/local/docker/nginx/logs:/var/log/nginx
shop-api:
container_name: "shop-api"
image: "shop-api:0.1"
# 网段
networks:
- shop
ports:
- "8081:8081"
volumes:
# 数据挂载、配置文件挂载、日志信息挂载
- /usr/local/docker/shop/api/images:/images
rabbitmq:
# 容器名
container_name: "rabbitmq"
# 镜像
image: "rabbitmq:3.7.15"
# 开机重启
restart: always
# 网段
networks:
- shop
# 端口映射
ports:
- "5672:5672"
- "15672:15672"
# 环境变量
environment:
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
RABBITMQ_DEFAULT_VHOST: ${RABBITMQ_DEFAULT_VHOST}
# 数据卷映射
volumes:
- /usr/local/docker/rabbitmq/data:/usr/lib/rabbitmq
redis:
container_name: "redis"
image: "redis:6.2.7"
restart: always
networks:
- shop
ports:
- "6379:6379"
volumes:
# 数据挂载、配置文件挂载、日志信息挂载
- /usr/local/docker/redis/data:/data
- /usr/local/docker/redis/config/redis.conf:/usr/local/redis/config/redis.conf
- /usr/local/docker/redis/logs:/logs
# 启动命令
command: [ "redis-server","/usr/local/redis/config/redis.conf" ]
mysql:
container_name: "mysql"
image: "mysql:8.0.30"
# 重启策略
restart: always
networks:
- shop
# 端口映射
ports:
- "3306:3306"
volumes:
# 数据挂载
- /usr/local/docker/mysql/data:/var/lib/mysql
# 配置文件挂载
- /usr/local/docker/mysql/config:/etc/mysql/conf.d
environment:
# root用户密码
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
# mysql时区
TZ: Asia/Shanghai
command:
# 将mysql8.0默认密码策略修改为原先策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
# 网段
networks:
shop:
.env
# RabbitMq相关配置
RABBITMQ_DEFAULT_USER=guest
RABBITMQ_DEFAULT_PASS=guest
RABBITMQ_DEFAULT_VHOST=/
# mysql密码
MYSQL_PASSWORD=0823..
Docker命令
systemctl enable docker # 开机启动
systemctl start docker # 启动
systemctl restart docker # 重启
systemctl status docker # 状态
systemctl stop docker # 停止
镜像基本命令
docker version # docker版本
docker info # 基本信息
docker images # 查看全部镜像
docker images -q # 查看全部镜像id
docker search 镜像名 # 搜索镜像
docker pull 镜像名/镜像名:版本/镜像id # 拉取下载镜像
docker image rm -f 镜像名/镜像id # 删除镜像
docker image rm -f $(docker images -q) # 删除全部镜像
容器相关命令
docker top 容器名/容器id # 容器内进程
docker inspect 容器名/容器id # 查看容器内细节
docker ps # 查看启动中的容器列表
docker ps -a # 查看启动以及挂起的容器列表
docker ps -q # 只显示容器id
docker ps -a --no-trunc # 查看详细内容的容器列表
docker pause 容器名/容器id # 暂停容器
docker unpause 容器名/容器id # 恢复容器
docker start 容器名/容器id # 启动容器
docker restart 容器名/容器id # 重启容器
docker stop 容器名/容器id # 正常停止容器
docker kill 容器名/容器id # 立即停止容器
docker rm -f 容器名/容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除全部容器
docker logs 容器名/容器id # 查看容器日志
docker logs -t -f --tail number 容器名/容器id #查看容器日志 -t 显示容器时间戳 -f持续监听 --tail 显示最后几条
docker exec -it 容器名/ 容器id bash # 进入容器内部
docker cp 宿主机文件保存路径 容器名/容器id:容器路径 # 将宿主机文件拷贝至容器内
docker cp 容器名/容器id:容器路径 宿主机文件保存路径 # 将容器内文件拷贝至宿主机
启动命令详解
docker run -d -p --name -e -v --restart --network 容器id/容器名
# -d 后台守护进程启动
# -v 宿主机与容器数据卷关联(可以使用别名、或者绝对路径、如果是别名数据会在:/usr/lib/docker/volum/别名/_data) :ro 只读 只允许宿主机操作
# -p 宿主机端口:容器端口 端口的映射
# --name 容器名称
# --restart=always docker重启后自动加载该容器
# -e (environment)环境变量
# --network 指定网络桥段
数据卷
docker volume list # 查看数据卷列表
docker volume create 数据卷名 # 创建数据卷
docker volume inspect 数据卷名 # 数据卷信息
docker volume rm 数据卷名 # 删除数据卷
镜像命令
docker commit -m "描述" -a "作者" 容器id 打包后镜像名:TAG(版本) # 容器打包成为镜像
docker save 镜像名 -o 名称.tar # 打包镜像
docker reload -i 名称.tar # 恢复载入镜像
网络桥段
docker network list # 查看网络桥段列表
docker network create -d bridge 网桥名 # 创建网络桥段 (bridge 桥段)
docker network rm 网桥名 # 删除网络桥段
docker network connect 网络桥段名 容器id/名称 # 容器加入网络桥段
docker inspect 容器id/名称 # 查看容器对应网络桥段信息
Dockerfile命令
docker build -t 镜像名:版本 . # 对Dockerfile进行构建镜像
docker-compose命令
docker-compose up -d # 后台启动docker-compose编排文件
docker-compose down # 此命令后停止up命令所启动的容器,并移除网络
docker-compose exec [service] # 进入指定容器
docker-compose ps [service] # 列出项目中所有的容器
docker-compose restart [service] # 重启项目中容器
docker-compose rm -f [service] # 删除项目中所有容器
docker-compose start [service] # 启动项目中容器(或指定容器)
docker-compose stop [service] # 暂停项目中容器(或指定容器
# 从DockerHub仓库中拉去mysql8.0.30版本镜像文件
docker pull mysql:8.0.30
# 启动命令
docker run -d -p 3306:3306 --name mysql --restart=always -e MYSQL_ROOT_PASSWORD=0823.. -v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d -v /usr/local/docker/mysql/data:/var/lib/mysql mysql:8.0.30
-e MYSQL_ROOT_PASSWORD=0823.. # 指定root密码
--restart=always # docker重启后自动加载该容器
-v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d # mysql配置文件与宿主机绑定
-v /usr/local/docker/mysql/data:/var/lib/mysql # mysql的数据与宿主机进行绑定
-d 后台运行 -p 端口映射 --name设置名称
# 导出全部库结构+数据
docker exec 容器名/容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库结构+数据
docker exec mysql sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库表结构(不包含数据)
docker exec mysql sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 执行sql
docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql
解决 Authentication plugin ‘caching_sha2_password‘ cannot be loaded 问题
# 原因是Nactive密码加密方式与mysql版本不一致导致,要么升级Nactive,要么将mysql的加密方式回退,此处采用重新指定mysql加密方式来进行
docker exec -it mysql bash # 进入mysql容器
mysql -u root -p # 进入mysql
# 修改账户密码加密规则
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
# 更新用户的密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
# 刷新权限
FLUSH PRIVILEGES;
# 重置密码
alter user 'root'@'%' identified by '0823..';
参考文献
docker-compose.yml
version: '3'
services:
yapi-web:
image: jayfong/yapi:latest
container_name: yapi-web
ports:
- 3000:3000
environment:
- YAPI_ADMIN_ACCOUNT=[email protected]
- YAPI_ADMIN_PASSWORD=admin
- YAPI_CLOSE_REGISTER=true
- YAPI_DB_SERVERNAME=yapi-mongo
- YAPI_DB_PORT=27017
- YAPI_DB_DATABASE=yapi
- YAPI_MAIL_ENABLE=false
- YAPI_LDAP_LOGIN_ENABLE=false
- YAPI_PLUGINS=[]
depends_on:
- yapi-mongo
links:
- yapi-mongo
networks:
- yapi
restart: unless-stopped
yapi-mongo:
image: mongo:latest
container_name: yapi-mongo
volumes:
- ./data/db:/data/db
networks:
- yapi
expose:
- 27017
restart: unless-stopped
networks:
yapi:
启动命令:docker-compose run -d
部署后台服务
shop-api-0.0.1-SNAPSHOT.jar
至服务器FROM java:8
COPY *.jar /shop-api-0.0.1-SNAPSHOT.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","shop-api-0.0.1-SNAPSHOT.jar"]
**docker build -t images_name:version .**
** **
**docker run -d -p 8088:8088 --name=admin-api --network=app images_name:version**
部署Nginx&Vue项目
npm run build:prod
将产物dist目录移至服务器指定目录(与Nginx容器所对应的静态资源数据卷位置)http {
server {
listen 80;
server_name 10.0.4.14 www.snowl.space;
error_page 500 502 503 504 /50x.html;
error_page 400 404 error.html;
location / {
root /usr/share/nginx/html; # 网站根目录
index index.html index.htm; # 默认首页文件
try_files $uri $uri/ @rewrite; # 防止重定向问题
}
location @rewrite{
rewrite ^.*$ /index.html last;
}
# 后台接口
location /neo/ {
proxy_pass http://admin-api:8808;
}
}
}
启动Nginx 并配置对应数据卷
docker run -d -p 80:80 --name app_nginx --network=app_app --restart=always -v /usr/local/docker/app/nginx/config/nginx.conf:/etc/nginx/nginx.conf
-v /usr/local/docker/app/nginx/logs:/var/log/nginx -v /usr/local/docker/app/admin/vue/dist:/usr/share/nginx/html nginx