Docker安装与基本使用
# 一、Docker 的安装
1、我们这里以CentOS为例,Docker 要求 CentOS 系统的内核版本高于 3.10
通过 uname -r 命令查看你当前的内核版本
uname -r
2、使用 root 权限登录 Centos。确保 yum 包更新到最新
yum -y update
3、卸载旧版本(如果安装过旧版本的话)
sudo yum remove -y docker*
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils
5、设置yum源,并更新 yum 的包索引
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
2
6、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
7、安装docker
yum install -y docker-ce-3:19.03.9-3.el7.x86_64 # 这是指定版本安装
8、启动并加入开机启动
systemctl start docker && systemctl enable docker
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)
[root@node0 docker]# docker version
Client: Docker Engine - Community
Version: 23.0.1
API version: 1.42
Go version: go1.19.5
Git commit: a5ee5b1
Built: Thu Feb 9 19:51:00 2023
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 23.0.1
API version: 1.42 (minimum version 1.12)
Go version: go1.19.5
Git commit: bc3805a
Built: Thu Feb 9 19:48:42 2023
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.18
GitCommit: 2456e983eb9e37e47538f59ea18f2043c9a73640
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
注意:一般需要配置docker镜像加速器
我们可以借助阿里云的镜像加速器,登录阿里云 (opens new window)
可以看到镜像加速地址如下图:
cd /etc/docker
查看有没有 daemon.json。这是docker默认的配置文件。
如果没有新建,如果有,则修改。
vim daemon.json
{
"registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]
}
2
3
4
保存退出,重启docker服务
systemctl daemon-reload
systemctl restart docker
2
10、卸载docker
yum remove -y docker*
rm -rf /etc/systemd/system/docker.service.d
rm -rf /var/lib/docker
rm -rf /var/run/docker
2
3
4
# 二、Docker常用命令
# 2.1、镜像相关命令
1、搜索镜像 docker search java
[root@node0 docker]# docker search java
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
node Node.js is a JavaScript-based platform for s… 12412 [OK]
tomcat Apache Tomcat is an open source implementati… 3495 [OK]
ghost Ghost is a free and open source blogging pla… 1603 [OK]
couchdb CouchDB is a database that uses JSON for doc… 510 [OK]
java DEPRECATED; use "openjdk" (or other JDK impl… 1978 [OK]
groovy Apache Groovy is a multi-faceted language fo… 139 [OK]
amazoncorretto Corretto is a no-cost, production-ready dist… 283 [OK]
jetty Jetty provides a Web server and javax.servle… 391 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 104 [OK]
ibmjava Official IBM® SDK, Java™ Technology Edition … 108 [OK]
appdynamics/java-agent Java Agent for Kubernetes 9
bitnami/java Bitnami Java Docker Image 15 [OK]
airbyte/java-datadog-tracer-base Docker image that provides the DataDog Java … 0
circleci/java This image is for internal use 2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
以上列表包含五列,含义如下:
- NAME:镜像仓库名称。
- DESCRIPTION:镜像仓库描述。
- STARS:镜像仓库收藏数,表示该镜像仓库的受欢迎程度,类似于 GitHub的 stars0
- OFFICAL:表示是否为官方仓库,该列标记为[0K]的镜像均由各软件的官方项目组创建和维护。
- AUTOMATED:表示是否是自动构建的镜像仓库。
2、下载镜像
使用命令docker pull命令即可从 Docker Registry上下载镜像,执行该命令后,Docker会从 Docker Hub中的 java仓库下载最新版本的 Java镜像。如果要下载指定版本则在java后面加冒号指定版本,例如:docker pull java:9
[root@node0 docker]# docker pull java:9
9: Pulling from library/java
96adffeba971: Pull complete
b72591232915: Pull complete
43e5ec7de751: Pull complete
121993890cd4: Pull complete
8c137dfeb464: Pull complete
ec6d48ce44eb: Pull complete
ff400272ea3d: Pull complete
Digest: sha256:9bcef066dc6e6fe791b5ec8c610054e482c156add6d24a7b44556a100ff77ce4
Status: Downloaded newer image for java:9
docker.io/library/java:9
2
3
4
5
6
7
8
9
10
11
12
3、列出镜像 docker images
[root@node0 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
microservice-eureka-server 0.0.1 a68f5f39f2fc 10 months ago 683MB
yuanyue999/microservice-eureka-server 0.0.1 a68f5f39f2fc 10 months ago 683MB
nginx ruanyou 94f278447c8a 10 months ago 142MB
nginx latest 12766a6745ee 11 months ago 142MB
openjdk 8 e24ac15e052e 14 months ago 526MB
ubuntu 14.04 13b66b487594 23 months ago 197MB
java 8 d23bdf5b1b1b 6 years ago 643MB
2
3
4
5
6
7
8
9
以上列表含义如下
- REPOSITORY:镜像所属仓库名称。
- TAG:镜像标签。默认是 latest,表示最新。
- IMAGE ID:镜像 ID,表示镜像唯一标识。
- CREATED:镜像创建时间。
- SIZE: 镜像大小。
4、删除本地镜像
#使用 docker rmi命令即可删除指定镜像,强制删除加 -f
docker rmi java
#删除所有镜像
docker rmi $(docker images -q)
2
3
4
# 2.2、容器相关命令
1、新建并启动容器 docker run
这样就能启动一个 Nginx容器。在本例中,为 docker run添加了两个参数,含义如下:
#-d 后台运行
#-p 宿主机端口:容器端口 #开放容器端口到宿主机端口
docker run -d -p 91:80 nginx
2
3
访问宿主机 IP:91,将会看到nginx的主界面如下:
需要注意的是,使用 docker run命令创建容器时,会先检查本地是否存在指定镜像。如果本地不存在该名称的镜像, Docker就会自动从 Docker Hub下载镜像并启动一个 Docker容器。
使用以下docker run命令即可新建并启动一个容器,该命令是最常用的命令,它有很多选项,下面将列举一些常用的选项。
-d选项:表示后台运行
-P选项:随机端口映射
-p选项:指定端口映射,有以下四种格式。
-- ip:hostPort:containerPort
-- ip::containerPort
-- hostPort:containerPort
-- containerPort
--net选项:指定网络模式,该选项有以下可选参数:
--net=bridge:默认选项,表示连接到默认的网桥。
--net=host:容器使用宿主机的网络。
--net=container:NAME-or-ID:告诉 Docker让新建的容器使用已有容器的网络配置。
--net=none:不配置该容器的网络,用户可自定义网络配置。
2、列出容器 docker ps
[root@node0 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
444e9ee5c604 nginx:ruanyou "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:92->80/tcp, :::92->80/tcp clever_montalcini
82c72b13f73f nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:91->80/tcp, :::91->80/tcp confident_ellis
2
3
4
如需列出所有容器(包括已停止的容器),可使用-a参数。该列表包含了7列,含义如下
- CONTAINER_ID:表示容器 ID。
- IMAGE:表示镜像名称。
- COMMAND:表示启动容器时运行的命令。
- CREATED:表示容器的创建时间。
- STATUS:表示容器运行的状态。UP表示运行中, Exited表示已停止。
- PORTS:表示容器对外的端口号。
- NAMES:表示容器名称。该名称默认由 Docker自动生成,也可使用 docker run命令的--name选项自行指定。
3、停止容器 docker stop
#其中f0b1c8ab3633是容器 ID,当然也可使用 docker stop容器名称来停止指定容器
docker stop f0b1c8ab3633
#强制停止容器
docker kill f0b1c8ab3633
#使用docker run命令,即可新建并启动一个容器。对于已停止的容器,可使用 docker start命令来**启动**
docker start f0b1c8ab3633
2
3
4
5
6
4、查看容器所有信息
docker inspect f0b1c8ab3633
5、查看容器日志
docker container logs f0b1c8ab3633
6、查看容器里的进程
docker top f0b1c8ab3633
7、容器与宿主机相互复制文件
#从容器里面拷文件到宿主机
#docker cp 容器id:要拷贝的文件在容器里面的路径 宿主机的相应路径
docker cp 7aa5dc458f9d:/etc/nginx/nginx.conf /mydata/nginx
#从宿主机拷文件到容器里面
#docker cp 要拷贝的宿主机文件路径 容器id:要拷贝到容器里面对应的路径
2
3
4
5
6
8、进入容器 docker exec
#有的容器需要把 /bin/bash 换成 sh
docker exec -it f0b1c8ab3633 /bin/bash
2
9、容器内安装vim、ping、ifconfig等指令
apt-get update
apt-get install vim #安装vim
apt-get install iputils-ping #安装ping
apt-get install net-tools #安装ifconfig
2
3
4
10、删除容器 docker rm
#删除指定容器
docker rm f0b1c8ab3633
#强制删除所有容器
docker rm -f $(docker ps -a -q)
2
3
4
11、查看容器资源使用情况的指令
docker stats # 返回容器资源的实时使用情况,1秒刷新一次
docker stats --no-stream # 返回容器当时的资源使用情况
2
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
444e9ee5c604 clever_montalcini 0.00% 1.996MiB / 2.761GiB 0.07% 2.57kB / 1.87kB 8.19kB / 18.4kB 3
82c72b13f73f confident_ellis 0.00% 4.32MiB / 2.761GiB 0.15% 3.06kB / 2.46kB 28MB / 26.6kB 3
2
3
默认情况下,stats 命令会每隔 1 秒钟刷新一次输出的内容直到你按下 ctrl + c。下面是输出的主要内容:
[CONTAINER]:以短格式显示容器的 ID。
[CPU %]:CPU 的使用情况。
[MEM USAGE / LIMIT]:当前使用的内存和最大可以使用的内存。
[MEM %]:以百分比的形式显示内存使用情况。
[NET I/O]:网络 I/O 数据。
[BLOCK I/O]:磁盘 I/O 数据。
[PIDS]:PID 号。
注意:容器的内存使用最大限制默认可以接近宿主机的物理内存,可以通过"-m"参数限制容器可以使用的最大内存:
docker run -m 500M redis #限制容器的最大使用内存为500M
# 三、将微服务运行在docker上
# 3.1、Dockerfile常用指令
命令 | 用途 |
---|---|
FROM | 基础镜像文件 |
RUN | 构建镜像阶段执行命令 |
ADD | 添加文件,从src目录复制文件到容器的dest,其中 src可以是 Dockerfile所在目录的相对路径,也可以是一个 URL,还可以是一个压缩包 |
COPY | 拷贝文件,和ADD命令类似,但不支持URL和压缩包 |
CMD | 容器启动后执行命令 |
EXPOSE | 声明容器在运行时对外提供的服务端口 |
WORKDIR | 指定容器工作路径 |
ENV | 指定环境变量 |
ENTRYPINT | 容器入口, ENTRYPOINT和 CMD指令的目的一样,都是指定 Docker容器启动时执行的命令,可多次设置,但只有最后一个有效。 |
USER | 该指令用于设置启动镜像时的用户或者 UID,写在该指令后的 RUN、 CMD以及 ENTRYPOINT指令都将使用该用户执行命令。 |
VOLUME | 指定挂载点,该指令使容器中的一个目录具有持久化存储的功能,该目录可被容器本身使用,也可共享给其他容器。当容器中的应用有持久化数据的需求时可以在 Dockerfile中使用该指令。格式为: VOLUME["/data"]。 |
注意:RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令。
# 3.2、使用Dockerfile构建Docker镜像
Dockerfile是一个文本文件,其中包含了若干条指令,指令描述了构建镜像的细节
先来编写一个最简单的Dockerfile,以前文下载的Nginx镜像为例,来编写一个Dockerfile修改该Nginx镜像的首页
1、新建一个空文件夹docker-demo,在里面再新建文件夹app,在app目录下新建一个名为Dockerfile的文件,在里面增加如下内容:
FROM nginx
RUN echo '<h1>This is New Nginx!!!</h1>' > /usr/share/nginx/html/index.html
2
2、在Dockerfile所在路径执行以下命令构建镜像:
#其中,-t指定镜像名字,命令最后的点(.)表示Dockerfile文件所在路径
docker build -t nginx:yuanyue .
2
3、执行以下命令,即可使用该镜像启动一个 Docker容器
docker run -d -p 92:80 nginx:yuanyue
4、访问宿主机IP:92/,可看到下图所示界面
This is New Nginx!!!
# 3.3、使用Dockerfile构建微服务镜像
以项目microservice-eureka-server为例,将该微服务的可运行jar包构建成docker镜像
1、将jar包上传linux服务器/usr/local/docker-app/docker-demo/app/eureka目录,在jar包所在目录创建名为Dockerfile的文件
2、在Dockerfile中添加以下内容
# 基于哪个镜像
From java:8
# 复制文件到容器
ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar
# 声明需要暴露的端口
EXPOSE 8761
# 配置容器启动后执行的命令
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar
2
3
4
5
6
7
8
3、使用docker build命令构建镜像
# 格式: docker build -t 镜像名称:标签 Dockerfile的相对位置
docker build -t microservice-eureka-server:0.0.1 .
2
4、启动镜像,加-d可在后台启动
docker run -d -p 8761:8761 microservice-eureka-server:0.0.1
使用 -v 可以挂载一个主机上的目录到容器的目录
docker run -d -p 8761:8761 -v /log:/container-log microservice-eureka-server:0.0.1
加上JVM参数:
# --cap-add=SYS_PTRACE 这个参数是让docker能支持在容器里能执行jdk自带类似jinfo,jmap这些命令,如果不需要在容器里执行这些命令可以不加
docker run -e JAVA_OPTS='-Xms1028M -Xmx1028M -Xmn512M -Xss512K -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M' --cap-add=SYS_PTRACE -d -p 8761:8761 microservice-eureka-server:0.0.1
2
5、访问宿主机IP:8761/,可正常显示Eureka Server首页
6、将微服务镜像发布到远程镜像仓库
我们可以选择自建镜像仓库,也可以直接使用docker官方镜像仓库,这里我们选择docker官方镜像仓库,
首先,我们需要在docker官方镜像仓库 (opens new window)里注册一个账号,然后,在linux服务器上用docker login命令登录镜像仓库
[root@node0 docker]# docker login
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
2
3
4
5
6
7
要把镜像推送到镜像仓库,需要将镜像前面加个分组名(一般就是docker hub的账户名),执行如下命令修改镜像名字
docker tag microservice-eureka-server:0.0.1 yuanyue999/microservice-eureka-server:0.0.1
最后将镜像推送到远程仓库
docker push yuanyue999/microservice-eureka-server:0.0.1
我们登录到docker镜像查看下刚刚推送的镜像,这样镜像就能给别人用了