Docker容器编程

安装、卸载、配置镜像加速

卸载

$ 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

数据卷 volume

数据卷实现容器与宿主机数据共享的问题,镜像启动时指定数据卷;

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 # 指定网络桥段名称

Docker Compose 容器编排

安装

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]   暂停项目中容器(或指定容器)

docker-compose.yml

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]			# 暂停项目中容器(或指定容器

相关实战

Docker 启动MySQL镜像

# 从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 启动Yapi

参考文献
docker-compose.yml

version: '3'

services:
  yapi-web:
    image: jayfong/yapi:latest
    container_name: yapi-web
    ports:
      - 3000:3000
    environment:
      - YAPI_ADMIN_ACCOUNT=admin@docker.yapi
      - 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

Docker 部署前后端分离项目

部署后台服务

  1. 上传本地打包后产物 shop-api-0.0.1-SNAPSHOT.jar 至服务器
  2. 编写Dockerfile文件
FROM java:8
COPY *.jar /shop-api-0.0.1-SNAPSHOT.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar","shop-api-0.0.1-SNAPSHOT.jar"]
  1. 构建镜像:**docker build -t images_name:version .**** **
    1. images_name 镜像名
    2. version 版本号
  2. 启动后台服务器:**docker run -d -p 8088:8088 --name=admin-api --network=app images_name:version**

部署Nginx&Vue项目

  1. 打包Vue项目服务 npm run build:prod 将产物dist目录移至服务器指定目录(与Nginx容器所对应的静态资源数据卷位置)
  2. 初始化Nginx数据卷
    1. 日志:/usr/local/docker/app/nginx/config/nginx.conf
    2. 配置文件:/usr/local/docker/app/nginx/logs
    3. 静态资源:/usr/local/docker/app/admin/vue/dist
  3. 编辑配置文件,配置vue所请求的后端接口地址,此处可以通过容器名称进行
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
  • 48
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值