不得不说,近些年的容器技术得到了大面积的推广和使用,而在这几年中,我也略有使用,所以本文想记录下近些年在使用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
| sudo yum install -y yum-utils
|
添加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 \
|
需要测试版本的Docker请执行以下命令(可选)
1
| sudo yum-config-manager --enable docker-ce-test
|
使用yum安装docker
更新yum
安装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
用户组。
将当前用户加入到docker组
1 2 3
| # $USER 当前用户 sudo usermod -aG docker $USER # sudo gpasswd -a $USER docker
|
重启
重启后生效
安装可视化工具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
在随便一个浏览器访问
初次访问会需要设置一个用户密码!
登录之后,我们可以看到如上的一个界面,具体的使用细节我就不再赘述了,相信小伙伴们安装到了这步之后,就知道如何去使用了~
通过portainer
连接多个docker
我们上面说过,这个工具是可以管理多个docker的,所以接下来我们来介绍下如何接入(以下主要是api
的连接方式)
前期准备
首先,我们需要明确一件事情,就是我们要接入的远程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
|
配置远程docker服务
添加Environment
我这里选择Docker Standalone
连接方式我们选择api
,其他的方式也可以,需要的小伙伴可以自行尝试~
到这里,我们就将远程的docker服务添加进来了。
用docker-compose
安装redis
Compose
是用于定义和运行多容器 Docker
应用程序的工具。通过 Compose
,您可以使用 YML
文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
- 使用
Dockerfile
定义应用程序的环境。
- 使用
docker-compose.yml
定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
- 最后,执行
docker-compose up
命令来启动并运行整个应用程序。
接下来,我们用安装redis
来介绍如何使用docker-compose
构建我们需要的doker服务
安装docker-compose
下载当前的稳定版本
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
|
将可执行权限应用于二进制文件
1
| sudo chmod +x /usr/local/bin/docker-compose
|
创建软链接
1
| sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
|
查看版本
至此安装成功。
新建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 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 restart: always volumes: - ../redis.conf:/etc/redis/redis.conf:ro - ../data:/data - ../logs:/logs 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服务
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 .
|
查看镜像
第二种:用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
|