说说这些年用的docker

不得不说,近些年的容器技术得到了大面积的推广和使用,而在这几年中,我也略有使用,所以本文想记录下近些年在使用docker上的一些使用心得和使用经验。

安装docker

每个工具的使用第一步都是安装,我们也不例外。

Centos7为例

前言

Docker 支持 64 位版本 CentOS 7/8,并且要求内核版本不低于 3.10,如果内核版本不满足的,请升级内核。

卸载旧版本

旧版本的 Docker 称为 docker 或者 docker-engine

1
2
3
4
5
6
7
8
9
10
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine

更换yum国内源

  1. 安装依赖包

    1
    sudo yum install -y yum-utils
  2. 添加yum软件源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

    # 官方源
    # sudo yum-config-manager \
    # --add-repo \
    # https://download.docker.com/linux/centos/docker-ce.repo
  3. 需要测试版本的Docker请执行以下命令(可选)

    1
    sudo yum-config-manager --enable docker-ce-test

使用yum安装docker

  1. 更新yum

    1
    sudo yum update
  2. 安装docker-ce

    1
    sudo yum install docker-ce docker-ce-cli containerd.io

启动docker

1
2
sudo systemctl enable docker
sudo systemctl start docker

让普通用户也可以使用docker

默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

  1. 将当前用户加入到docker组

    1
    2
    3
    # $USER 当前用户
    sudo usermod -aG docker $USER
    # sudo gpasswd -a $USER docker
  2. 重启

    重启后生效

    1
    reboot

安装可视化工具portainer

安装好了docker之后,我们可以通过各种命令来愉快的进行操作,同时呢,我们也可以借助可视化工具来对多个docker进行管理,方便我们查看日志,或者管理容器。

在可视化工具这一块,我经常使用的是portainer,所以接下来就展示下如何安装及使用该工具。

安装portainer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查找portainer
docker search portainer
# 拉取portainer
docker pull portainer/portainer
# 启动容器
# 1.创建挂载文件
mkdir -p /home/data/docker/portainer/data
chmod 777 -R /home/data/docker/portainer/
# 2.启动
docker run -d \
-p 19000:9000 \
-p 18000:8000 \
--restart=always --privileged=true \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /home/parallels/docker/portainer/data:/data \
--name portainer portainer/portainer

访问portainer

在随便一个浏览器访问

1
http://localhost:19000

初次访问会需要设置一个用户密码!

image-20230312082729288

登录之后,我们可以看到如上的一个界面,具体的使用细节我就不再赘述了,相信小伙伴们安装到了这步之后,就知道如何去使用了~

通过portainer连接多个docker

我们上面说过,这个工具是可以管理多个docker的,所以接下来我们来介绍下如何接入(以下主要是api的连接方式)

  1. 前期准备

    首先,我们需要明确一件事情,就是我们要接入的远程docker服务是已经开放2375端口供外部链接(如没有,可根据如下步骤操作)

    1
    2
    3
    4
    5
    6
    7
    8
    # 我们假设远程docker服务叫做A,那么接下来我们需要对A所在的服务器进行操作
    # 1.修改docker配置文件
    vi /usr/lib/systemd/system/docker.service
    # 在ExecStart=/usr/bin/dockerd-current添加配置
    -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
    # 2.防火墙开放端口(如有开启防火墙的话,需要配置)
    firewall-cmd --zone=public --add-port=2375/tcp --permanent
    firewall-cmd --reload
  2. 配置远程docker服务

    添加Environment

    image-20230312083859322

    我这里选择Docker Standalone

    image-20230312083952874

    连接方式我们选择api,其他的方式也可以,需要的小伙伴可以自行尝试~

    image-20230312084210676

    到这里,我们就将远程的docker服务添加进来了。

docker-compose安装redis

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

接下来,我们用安装redis来介绍如何使用docker-compose构建我们需要的doker服务

安装docker-compose

  1. 下载当前的稳定版本

    1
    sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. 将可执行权限应用于二进制文件

    1
    sudo chmod +x /usr/local/bin/docker-compose
  3. 创建软链接

    1
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  4. 查看版本

    1
    docker-compose version

    image-20230312094311903

    至此安装成功。

新建redis相关的目录

建立这些目录是为了让我们更好的管理和复用

1
2
3
4
5
6
redis
|---compose
|---docker-compose.yml ---compose配置文件
|---data ---redis数据存储目录(挂载用)
|---logs ---redis日志文件目录(redis.conf中logfile设置相对路径则不需要)
|---redis.conf ---redis配置文件
1
2
3
4
mkdir redis && cd redis
mkdir compose data logs
touch compose/docker-compose.yml
touch redis.conf

编辑redis配置文件

1
vi redis.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#开启远程可连接	
#bind 127.0.0.1
#自定义密码
requirepass 12345678
#指定 Redis 监听端口(默认:6379)
port 6379
#客户端闲置指定时长后关闭连接(单位:秒。0:关闭该功能)
timeout 0
# 900s内如果至少一次写操作则执行bgsave进行RDB持久化操作
save 900 1
# 在300s内,如果至少有10个key进行了修改,则进行持久化操作
save 300 10
#在60s内,如果至少有10000个key进行了修改,则进行持久化操作
save 60 10000
#是否压缩数据存储(默认:yes。Redis采用LZ 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
#指定本地数据文件名(默认:dump.rdb)
dbfilename dump.rdb
#指定本地数据文件存放目录
dir /data
#指定日志文件位置(如果是相对路径,redis会将日志存放到指定的dir目录下)
logfile "redis.log"

编辑compose配置文件

1
vi compose/docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
version: "3.8"
services:
redis:
# 指定镜像及版本
image: redis:6.2.6
# 指定容器名
container_name: fedora-redis
# 是否启动docker,自启动该容器
restart: always
# 挂载 数据和配置持久化
volumes:
# 宿主机:容器 ro:docker容器对该文件只读,默认是rw可读可写
- ../redis.conf:/etc/redis/redis.conf:ro
# 宿主机:容器 数据
- ../data:/data
# 宿主机:容器 日志
- ../logs:/logs
# docker执行的启动命令
command: redis-server /etc/redis/redis.conf
# 端口映射
ports:
- 6378:6379

docker-compose启动和关闭

启动服务

1
2
3
cd compose
# 启动 -d 后台运行
docker-compose up -d
1
2
3
4
5
6
7
8
9
10
11
12
# 启动日志
[+] Running 7/7
⠿ redis Pulled 8.9s
⠿ 6d4a449ac69c Pull complete 4.4s
⠿ 29f18f34ea7f Pull complete 4.4s
⠿ c299869a5d25 Pull complete 4.5s
⠿ 57341d940d28 Pull complete 4.7s
⠿ 05c85b13ec38 Pull complete 4.8s
⠿ 5bc94d737d33 Pull complete
[+] Running 2/2
⠿ Network compose_default Created 0.1s
⠿ Container fedora-redis Started

出现如上的日志,那就证明我们的redis服务已经启动完毕了

1
2
3
4
5
6
7
8
# 查看进程
ps -ef |grep redis
# 查看端口
netstat -ntlp
# 验证redis是否启动
docker exec -it fedora-redis redis-cli
# 进入到redis客户端后,输入密码
auth 12345678

查看redis容器的cpu和内存使用情况

1
docker stats fedora-redis

关闭服务

1
2
3
4
# 该命令会将容器直接删除
docker-compose down
# 可以指定关闭redis服务(容器还在)
docker-compose stop redis

docker-compose安装mysql

新建mysql相关的目录

我们以安装mysql8.0为例

建立这些目录是为了让我们更好的管理和复用

1
2
3
4
5
6
mysql8
|---compose
|---docker-compose.yml ---compose配置文件
|---data ---mysql数据存储目录(挂载用)
|---logs ---mysql日志文件目录
|---conf ---mysql配置目录
1
2
3
mkdir mysql && cd mysql
mkdir compose data logs conf
touch compose/docker-compose.yml

编辑compose配置文件

1
vi compose/docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3.8"
services:
mysql8:
image: mysql
container_name: fedora-mysql8
restart: always
environment:
MYSQL_ROOT_PASSWORD: test
volumes:
- ../data:/var/lib/mysql
- ../logs:/logs
- ../conf:/etc/mysql/conf.d
command:
--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
ports:
- 3307:3306

启动mysql服务

image-20230312102729438

1
2
# 查看服务日志
docker logs fedora-mysql8
1
2
# 连接mysql(输入密码即可)
docker exec -it fedora-mysql8 mysql -uroot -p

进入到mysql客户端即成功。

Dockerfile构建服务镜像

第一种:直接用Dockerfile构建镜像

准备一个可执行jar(springboot)

我们用一个简单的springboot可执行jar(docker-jar-demo-0.0.1-SNAPSHOT.jar)作为操作对象,这个jar只有一个get接口/say,返回hello world

创建一个Dockerfile
1
2
3
4
5
6
7
FROM openjdk:8-jdk-alpine
MAINTAINER gcoder
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","-Xmx10m","-Xms10m","app.jar"]
构建镜像
1
2
# 没有指定版本 默认是latest
docker build --build-arg JAR_FILE=./docker-jar-demo-0.0.1-SNAPSHOT.jar -t hello .
查看镜像
1
docker images

第二种:用maven插件和Dockerfile命令构建镜像

pom.xml添加docker插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<baseImage>java</baseImage>
<entryPoint>
["java","-jar","-Xmx10m","-Xms10m","/${project.build.finalName}.jar"]
</entryPoint>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
执行maven构建命令
1
mvn package docker:build

第三种:用maven插件读取Dockerfile进行构建

pom.xml添加docker插件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>${project.name}:${project.version}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<skipDockerBuild>false</skipDockerBuild>
<resources>
<resource>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
Dockefile指定路径建立Dockerfile文件
1
2
3
4
5
6
FROM openjdk:8-jdk-alpine
MAINTAINER gcoder
VOLUME /tmp
COPY docker-jar-demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","-Xmx10m","-Xms10m","app.jar"]
执行maven构建命令
1
mvn package docker:build

说说这些年用的docker
https://gcoder5.com/2023/03/12/说说这些年用的docker/
作者
Gcoder
发布于
2023年3月12日
许可协议