Docker是一个开源的应用容器引擎,由Go语言开发,基于Linux内核技术。Docker通过将应用及其依赖打包到可移植的容器中,实现了应用的快速部署和高效管理。Docker容器具有轻量级、快速启动、可移植性强等特点,能够显著提升资源利用率和开发效率。它广泛应用于开发、测试、生产等环境,是微服务架构和DevOps文化中的关键工具。Docker还提供了丰富的社区支持和生态系统,助力企业快速构建和部署应用。
docker有两个版本,一个是无界面的docker engine,另一个是有界面的docker desktop。
查看官网:https://docs.docker.com/engine/install/centos/
查看链接可能需要科学上网
当前Linux版本:
shell
lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: AlibabaCloud
Description: Alibaba Cloud Linux release 3 (Soaring Falcon)
Release: 3
Codename: SoaringFalcon
由于docker官方网络原因,简简单单的安装也颇费周折,最后总算是安装成功了,详细记录如下:
1、卸载老版本
shell
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、配置docker仓库
shell
sudo yum install -y yum-utils
# 配置yum源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
注意:上面这个官方链接可能访问不了(不翻墙),或者太慢,换成阿里云的镜像即可
shell
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
下面是命令的详细解释:
yum-config-manager
:这是yum
工具包中的一个实用程序,用于管理 yum 仓库的配置文件。它允许你添加、删除、启用或禁用仓库,而无需直接编辑仓库的配置文件。--add-repo
:这个选项告诉yum-config-manager
你要执行的操作是添加一个新的 yum 仓库。https://download.docker.com/linux/centos/docker-ce.repo
:这是 Docker CE 官方为 CentOS 系统提供的 yum 仓库的 URL。这个仓库包含了 Docker CE 的所有包和依赖项,使得安装和更新 Docker CE 变得简单。
3、安装最新版docker
shell
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
官方的镜像访问不了
shell
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker CE Stable - x86_64 0.0 B/s | 0 B 02:00
Errors during downloading metadata for repository 'docker-ce-stable':
- Curl error (28): Timeout was reached for https://download.docker.com/linux/centos/8/x86_64/stable/repodata/repomd.xml [Connection timed out after 30000 milliseconds]
官方镜像访问不了,换成阿里云的就可以了
shell
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@iZm5e33cshwe0x9z1t5yleZ ai]# sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Docker CE Stable - x86_64 69 kB/s | 66 kB 00:00
Dependencies resolved.
.................................
.........................
Verifying : docker-ce-cli-1:26.1.3-1.el8.x86_64 10/12
Verifying : docker-ce-rootless-extras-26.1.3-1.el8.x86_64 11/12
Verifying : docker-compose-plugin-2.27.0-1.el8.x86_64 12/12
Installed:
containerd.io-1.6.32-3.1.el8.x86_64 docker-buildx-plugin-0.14.0-1.el8.x86_64
docker-ce-3:26.1.3-1.el8.x86_64 docker-ce-cli-1:26.1.3-1.el8.x86_64
docker-ce-rootless-extras-26.1.3-1.el8.x86_64 docker-compose-plugin-2.27.0-1.el8.x86_64
fuse-overlayfs-1.13-1.0.1.al8.x86_64 fuse3-3.3.0-17.al8.x86_64
fuse3-libs-3.3.0-17.al8.x86_64 libcgroup-0.41-19.2.al8.x86_64
libslirp-4.4.0-2.al8.x86_64 slirp4netns-1.2.3-1.al8.x86_64
Complete!
安装过程会出现两次需要确认的步骤Is this ok [y/N]: y
输入y就可以了
4、启动docker
启动
shell
systemctl start docker
重启
shell
systemctl restart docker
开机启动
shell
systemctl enable docker
查看状态:已经启动
shell
systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset>
Active: active (running) since Sat 2024-08-03 00:52:32 CST; 18min ago
Docs: https://docs.docker.com
Main PID: 3810220 (dockerd)
Tasks: 11
Memory: 37.5M
CGroup: /system.slice/docker.service
└─3810220 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/conta>
查看状态:没有启动
shell
systemctl status docker
?.docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://docs.docker.com
5、查看版本
docker version
shell
docker version
Client: Docker Engine - Community
Version: 26.1.3
API version: 1.45
Go version: go1.21.10
Git commit: b72abbb
Built: Thu May 16 08:34:39 2024
OS/Arch: linux/amd64
Context: default
docker --version
Docker version 26.1.3, build b72abbb
6、运行hello world测试
出现如下日志说明测试通过
shell
sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
由于特殊原因,出现连接超时,如下提示。需要配置国内镜像
shell
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Retrying in 1 second
docker: error pulling image configuration: download failed after attempts=6: dial tcp 199.16.156.11:443: i/o timeout.
See 'docker run --help'.
7、配置镜像
由于官方镜像被墙,所以需要配置其他可访问镜像
sudo vim /etc/docker/daemon.json
在daemon.json 中写入如下配置,没有就新建
json
{
"registry-mirrors": [
"https://ustc-edu-cn.mirror.aliyuncs.com/",
"https://ccr.ccs.tencentyun.com/",
"https://docker.m.daocloud.io/"
]
}
保存配置后重启docker。systemctl restart docker
如果重启报错,使用命令查看错误原因:journalctl -xe | grep docker
8、使用docker安装一个应用
安装MQTT协议的broker EMQX
shell
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest
docker run
: 这是Docker的一个基本命令,用于从镜像启动新的容器。-d
: 这个选项告诉Docker以"分离模式"(detached mode)运行容器,即容器在后台运行。--name emqx
: 这个选项允许你为容器指定一个名称,这里是emqx
。给容器命名使得后续管理(如停止、删除、查看日志等)更加方便。-p 1883:1883
: 这个选项将容器的1883端口映射到宿主机的1883端口。MQTT协议的默认端口是1883,这个映射使得外部客户端可以通过宿主机的1883端口与EMQX通信。-p 8083:8083
: 这个选项将容器的8083端口映射到宿主机的8083端口。EMQX使用8083端口提供HTTP API和Dashboard服务,允许你通过Web界面管理EMQX。-p 8084:8084
: 这个选项将容器的8084端口提供给WebSocket服务。-p 8883:8883
: MQTT over SSL/TLS的默认端口是8883。这个映射使得外部客户端可以通过SSL/TLS加密的方式与EMQX通信。-p 18083:18083
: 类似于8083端口,但18083通常用于HTTP API的加密版本(HTTPS)。emqx/emqx:latest
: 这指定了要使用的Docker镜像的名称和标签。emqx/emqx
是镜像的仓库名和所有者名,`la
还有另外一种 基于Cloudflare Workers 的 Docker 镜像代理工具的方式:https://github.com/cmliu/CF-Workers-docker.io/tree/main
9、其他命令
查看运行的docker应用
shell
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0f848b42a08d emqx/emqx:latest "/usr/bin/docker-ent?? 13 minutes ago Up 13 minutes 4369-4370/tcp, 5369/tcp, 6369-6370/tcp, 0.0.0.0:1883->1883/tcp, :::1883->1883/tcp, 0.0.0.0:8083-8084->8083-8084/tcp, :::8083-8084->8083-8084/tcp, 8081/tcp, 0.0.0.0:8883->8883/tcp, :::8883->8883/tcp, 0.0.0.0:18083->18083/tcp, :::18083->18083/tcp, 11883/tcp emqx
查看容器信息
容器的id,用docker ps查看
shell
docker inspect 0f848b42a08d
[
{
"Id": "0f848b42a08dfd1817cf708ae6962ada91cf03384af12452c8c4f7f920a6c406",
"Created": "2024-08-12T06:48:42.879101974Z",
"Path": "/usr/bin/docker-entrypoint.sh",
"Args": [
"/opt/emqx/bin/emqx",
"foreground"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1148080,
"ExitCode": 0,
"Error": "",
"StartedAt": "2024-08-12T06:48:43.677078425Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:0ef9bc19d70ec1e5d1a32ac2aa57eb2f1057e19c3f7bccb3c37b300b57480560",
"ResolvConfPath": "/var/lib/docker/containers/0f848b42a08dfd1
.....
进入容器
shell
docker exec -it 0f848b42a08d bash
bash-5.0$ ls
bin data erts-11.1.8 etc lib log releases
bash-5.0$
限制使用内存
shell
允许容器最多使用500M内存和100M的swap:
# 允许使用的swap=memory-swap - memory
# memory-swap='-1'时,无限制使用swap
# memory-swap 不设置时,默认swap的值时memory的2倍
# memory-swap的值等于memory值时,禁用swap
docker run -d --name mynginx1 --memory="500m" --memory-swap="600M" nginx
限制使用CPU
允许容器最多使用一个半的CPU:
shell
docker run -d --name mynginx2 --cpus="1.5" nginx
允许容器最多使用50%的CPU:
shell
docker run -d --name mynginx3 --cpus='.5' nginx
10、打包java项目
10.1 创建 Dockerfile
文件名就是Dockerfile
,没有任何前缀或后缀。当你运行docker build
命令时,Docker会在当前目录下查找名为Dockerfile
的文件,并根据其中的指令构建镜像。
shell
# 使用官方Java运行时环境作为基础镜像
# FROM openjdk:11-jre-slim
# 使用官方OpenJDK 17 JDK镜像作为基础镜像
FROM openjdk:17-jdk-slim
# 设置工作目录为/app
WORKDIR /app
# 将当前目录下的jar文件复制到容器的/app目录下
COPY ai-springboot.jar /app
# 声明暴露端口。端口生效最终是由-p 9000:9000指定的,这里只是文档式声明
EXPOSE 9000
# 使用ENV指令设置环境变量
ENV SPRING_PROFILES_ACTIVE prod
# 定义容器启动时执行的命令
ENTRYPOINT ["java","-jar","/app/ai-springboot.jar"]
环境变量也可以运行命令式时指定: -e SPRING_PROFILES_ACTIVE=prod
设置了环境变量SPRING_PROFILES_ACTIVE( spring.profiles.active )的值为prod
10.2 构建镜像
在Dockerfile所在的目录下,执行以下命令来构建镜像:
shell
docker build -t ai-app .
-t ai-app
指定了镜像的名称为ai-app
,仓库在本地.
指定了构建上下文的路径,这里是当前目录
shell
docker build -t ai-app .
[+] Building 38.8s (8/8) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 552B 0.0s
=> [internal] load metadata for docker.io/library/openjdk:1 16.4s
........
=> [2/3] WORKDIR /app 0.0s
=> [3/3] COPY ai-springboot.jar /app 0.2s
=> exporting to image 0.4s
=> => exporting layers 0.4s
=> => writing image sha256:2eaf1552bb3fa483258d0c617b0770f4d 0.0s
=> => naming to docker.io/library/ai-app 0.0s
10.3 运行容器
shell
docker run -d -p 9000:9000 ai-app
-d
表示以守护进程模式运行容器
-p 9000:9000
表示将容器的9000端口映射到宿主机的9000端口(前面一个是宿主机端口)。-p 9001:9000
则需要使用http://IP:9001
访问
10.4 验证
可以通过访问http://IP:9000
来验证应用是否正常运行