快速上手之docker

Docker 环境搭建

安装 docker

官网安装文档:https://docs.docker.com/install/linux/docker-ce/centos/

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo systemctl start docker

sudo systemctl enable docker

docker 配置

docker 重写命令

# 修改/root/.bashrc文件
vi /root/.bashrc

内容如下:

.bashrc

User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format"table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'

Source global definitions

if [-f /etc/bashrc]; then
. /etc/bashrc
fi

source /root/.bashrc

docker 追加命令

docker update --restart=always mycontainer

docker 远程访问

编辑宿主机文件

vim /usr/lib/systemd/system/docker.service

在 [service] 中的 ExecStart 配置最后面添加该配置

-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375

重新加载系统管理守护进程的配置文件

systemctl daemon-reload
sudo systemctl stop docker
sudo systemctl start docker

idea 插件 docker 连接:tcp://192.168.56.10:2375

证书配置:

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 查看网络详细信息
# 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

命令快速搭建

命令 说明
docker pull 拉取镜像
docker push 推送镜像到 DockerRegistry
docker images 查看本地镜像
docker rmi 删除本地镜像
docker run 创建并运行容器(不能重复创建)
docker stop 停止指定容器
docker start 启动指定容器
docker restart 重新启动容器
docker rm 删除指定容器
docker ps 查看容器
docker logs 查看容器运行日志
docker exec 进入容器
docker save 保存镜像到本地压缩文件
docker load 加载本地压缩文件到镜像
docker inspect 查看容器详细信息

mysql

# 拉取镜像
docker pull mysql:8.0.30

创建容器

docker run -d --name mysql8 -p 3307:3306 -v mysql_data:/var/lib/mysql -v mysql_conf:/etc/mysql --restart=always --privileged=true -e MYSQL_ROOT_PASSWORD=11111111 mysql:8.0.30

docker 安装完成 mysql8,如果使用 sqlyog 或者 navite 连接,需要修改密码加密规则,因为低版本客户端工具不支持 mysql8 最新的加密规则。如果使用客户端连接,需要修改:

  • docker exec 进入 mysql 容器

  • mysql -uroot -p 登录你的 MySQL 数据库,然后 执行这条 SQL:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '11111111';

然后再重新配置 SQLyog 的连接,重新填写密码,则可连接成功了。

redis

#1 拉取镜像
docker pull redis:7.0.10

#2 在宿主机的 /var/lib/docker/volumes/redis-config/_data/ 目录下创建一个 redis 的配置文件,
vim redis.conf

内容如下所示

#开启持久化
appendonly yes
port 6379

设置密码

requirepass 11111111
bind 0.0.0.0

#3 如果 /var/lib/docker/volumes 没有 redis-config,创建数据卷
docker volume create redis-config

#4 创建容器
docker run -d -p 6380:6379 --restart=always
-v redis-config:/etc/redis/config
-v redis-data:/data
--requirepass 11111111
--name redis7 redis:7.0.10
redis-server /etc/redis/config/redis.conf

临时设置密码
docker exec -it my-redis redis-cli
CONFIG SET requirepass 11111111

mongdb


minio

//拉取镜像
docker pull quay.io/minio/minio

// 创建数据存储目录
mkdir -p ~/minio/data

// 创建minio
docker run
-p 9000:9000
-p 9090:9090
--name minio
-v ~/minio/data:/data
-e "MINIO_ROOT_USER=minioadmin"
-e "MINIO_ROOT_PASSWORD=minioadmin"
-d
quay.io/minio/minio server /data --console-address ":9090"

gitlab

# 拉取
docker pull gitlab/gitlab-ce

docker run
-it
--detach
--privileged=true
--hostname 192.168.56.10
--publish 4443:443 --publish 9980:80 --publish 5022:22
--name gitlab
--restart always
--volume /data/docker/gitlab/etc:/etc/gitlab
--volume /data/docker/gitlab/log:/var/log/gitlab
--volume /data/docker/gitlab/data:/var/opt/gitlab
gitlab/gitlab-ce:latest

docker exec -it gitlab cat /etc/gitlab/initial_root_password


ftp

docker run -d -v /root/ftp:/home/vsftpd \
-p 60020:20 -p 60021:21 -p 61100-61105:61100-61105 \
-e FTP_USER=1 -e FTP_PASS=11111111 \
-e PASV_ADDRESS=1.2.3.4 -e PASV_MIN_PORT=61100 -e PASV_MAX_PORT=61105 \
-e PASV_ADDRESS=192.168.56.10 \
--name vsftpd --restart=always fauria/vsftpd

ftp://192.168.56.10:60021

nginx

#拉取镜像
docker pull nginx:latest

#运行 nginx 镜像
docker run -d -p 87:80
--name nginx-lecizx
-v nginx_html:/usr/share/nginx/html
-v nginx_conf:/etc/nginx/
-v nginx_logs:/var/log/nginx nginx:

nginx-spzx 容器的管理命令

docker start nginx-lecizx # 启动容器
docker stop nginx-lecizx # 关闭容器
docker rm nginx-lecizx # 删除容器

nacos

nacos

nacos

# 拉取镜像
docker pull nacos/nacos-server:v2.2.2

创建容器

docker run --name nacos -e MODE=standalone -p 8848:8848 -p 9848:9848 -d --restart=always nacos/nacos-server:v2.2.2

nacos2.x 的版本新增了一个客户端与服务端的 gRpc 的通讯端口号 9848

http://192.168.56.10:8848/nacos
custom.env
docker run -d \
--name nacos \
--env-file ./nacos/custom.env \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--restart=always \
nacos/nacos-server:v2.1.0-slim

Jpom

Jpom 项目运维

docker volume create jpom-server-data
docker volume create jpom-server-logs
docker volume create jpom-server-conf

docker run -d -p 2122:2122
--name jpom-server
--restart=always
-v /etc/localtime:/etc/localtime:ro
-v jpom-server-data:/usr/local/jpom-server/data
-v jpom-server-logs:/usr/local/jpom-server/logs
-v jpom-server-conf:/usr/local/jpom-server/conf
jpomdocker/jpom

http://192.168.56.10:2122

seata

docker run --name seata \
-p 8099:8099 \
-p 7099:7099 \
-e SEATA_IP=192.168.56.10 \
-v ./seata:/seata-server/resources \
--privileged=true \
--network lecizx \
-d \
seataio/seata-server:1.5.2

dockerfile 构建

https://docs.docker.com/engine/reference/builder/

指令 说明
FROM 指定基础镜像
ENV 设置环境变量,可在后面指令使用
COPY 拷贝本地文件到镜像的指定目录
RUN 执行 Linux 的 shell 命令,一般是安装过程的命令
EXPOSE 指定容器运行时监听的端口,是给镜像使用者看的
ENTRYPOINT 镜像中应用的启动命令,容器运行时调用

部署 java 项目

# 1.构建项目镜像,不指定tag,则默认为latest
docker buid -t <imagesName> 本地目录路径(存放Dockerfile文件)
docker build -t lecizx .

2. 查看镜像

docker images

结果

REPOSITORY TAG IMAGE ID CREATED SIZE
lecizx latest 0bb07b2c34b9 43 seconds ago 362MB
docker-demo 1.0 49743484da68 24 hours ago 327MB
nginx latest 605c77e624dd 16 months ago 141MB
mysql latest 3218b38490ce 17 months ago 516MB

3. 创建并运行容器,并通过 --network 将其加入 lecizx 网络,这样才能通过容器名访问 mysql

docker run -d --name lecizx --network lecizx -p 8080:8080 lecizx

dockerfile

# 基础镜像,拷贝已有的java11
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 lecizx-service.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]

dockerCompose

安装 docker-compose

pip install docker-compose

Compose Build Specification | Docker Docs

Overview of docker compose CLI | Docker Docs

docker compose [OPTIONS] [COMMAND]
类型 参数或指令 说明
Options -f 指定 compose 文件的路径和名称
-p 指定 project 名称。project 就是当前 compose 文件中设置的多个 service 的集合,是逻辑概念
Commands up 创建并启动所有 service 容器
down 停止并移除所有容器、网络
ps 列出所有启动的容器
logs 查看指定容器的日志
stop 停止容器
start 启动容器
restart 重启容器
top 查看运行的进程
exec 在指定的运行中容器中执行命令

docker compose ui

spring boot 项目部署

1. 创建项目目录,存放需要部署的文件

2. 编写 docker-compose.yml 文件

2.docker compose up -d 命令后台,构建镜像,创建容器,并启动容器

mysql+nginx+spring boot

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:
- lecizx
lecizx:
build:
context: .
dockerfile: Dockerfile
container_name: lecizx
ports:
- "8080:8080"
networks:
- lecizx
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:
- lecizx
networks:
- lecizx
networks:
lecizx:
name: lecizx

# 1.进入root目录
cd /root

# 2.删除旧容器
docker rm -f $(docker ps -qa)

# 3.删除hmall镜像
docker rmi hmall

# 4.清空MySQL数据
rm -rf mysql/data

# 5.启动所有容器, -d 参数是后台启动
docker compose up -d

# 6.查看镜像
docker compose images


# 7.查看容器
docker compose ps


# 8.删除容器
docker compose down

redis 集群

docker-compose.yaml

network_mode:主机模式,直接与宿主机进行交互

version: "3.2"

services:
r1:
image: redis
container_name: r1
network_mode: "host"
entrypoint: ["redis-server", "--port", "7001"]
r2:
image: redis
container_name: r2
network_mode: "host"
entrypoint: ["redis-server", "--port", "7002"]
r3:
image: redis
container_name: r3
network_mode: "host"
entrypoint: ["redis-server", "--port", "7003"]

构建redis集群
docker compose up -d

# 进入容器配置从节点
# 连接容器r2
docker exec -it r2 redis-cli -p 7002
# 设置端口7001 r1为主节点
slaveof 192.168.56.10 7001

# 查询当前redis的主从关系以及配置信息
info replication

# 退出容器
exit

# 连接容器r3
docker exec -it r3 redis-cli -p 7003
# 设置端口7001 r1为主节点
slaveof 192.168.56.10 7001

# 测试redis集群
注:现在只能在r1上执行写操作
# 在r1上设置键值
set test01 test01
# 在r2,r3上获取参数值
get test02