概述

Docker是一个开源的应用容器引擎,可以让开发者打包应用及其依赖到一个轻量级、可移植的容器中,然后发布到任何Linux服务器上,也可以实现虚拟化。容器完全采用沙箱机制,格子独立,相互之间不会有任何接口暴漏,更重要的是容器的开销极低。

安装

介绍三种场景下docker的安装方式

Ubuntu

第一步:需要切换管理员指令

1
sudo su

第二步:更新Ubuntu系统上的软件包列表

1
apt-get update

第三步:安装依赖工具

1
apt install apt-transport-https ca-certificates curl software-properties-common gnupg

第四步:添加docker秘钥

1
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

第五步:添加docker软件源

1
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

第六步:安装Docker

1
apt-get install docker-ce docker-ce-cli containerd.io

第七步:检查Docker是否安装成功

1
docker --version

CentOS

第一步:切换为root用户

1
su + Enter

第二步:安装yum工具包

1
yum install -y yum-utils

第三步:设置阿里云镜像

1
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

第四步:安装Docker

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

第五步:启动Docker

1
systemctl start docker

第六步:设置Docker开机自启动

1
systemctl enable docker

第七步:检查Docker是否安装成功

1
docker --version

windows

Docker Desktop是Docker的Windows桌面版,在Windows上使用Docker只需要安装配置它即可
第一步:访问Docker官网,下载Docker desktop。

第二步:双击运行 Docker Desktop Installer.exe完成安装
Docker Desktop.png

第三步:配置镜像加速

在Docker Engine中加入以下信息:

1
2
3
4
5
6
"registry-mirrors": [
"https://registry.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn"
]

第四步:检查Docker是否安装成功

按住 win + r 进入控制命令终端,输入 docker --version 有显示版本号则安装成功。

使用

参数介绍

1
2
3
4
5
6
7
8
9
10
OPTIONS:选项参数,在输入指令时的一些配置参数,如运行容器时的端口映射、数据挂载等
IMAGE_NAME:镜像名称,在指令中用需要使用的真实镜像代替
TAG:镜像标签版本号
IMAGE_ID:镜像ID
FILE_NAME:压缩文件名称
CONTAINER_NAME:容器名称
CONTAINER_ID:容器ID
ARG:传递给命令的参数
NETWORK_NAME:容器网络名称
VOLUMN_NAME:数据卷名称

启动指令

1.启动Docker

1
systemctl start docker

2.关闭Docker

1
systemctl stop docker

3.重启Docker

1
systemctl restart docker

4.设置开机自启动

1
systemctl status docker

5.查看当前版本

1
docker --version

镜像指令

1.搜索镜像

1
docker search [IMAGE_NAME]

2.拉取镜像

1
docker pull [IMAGE_NAME]

3.拉取指定版本镜像

1
docker pull [IMAGE_NAME]:[TAG]

4.推送镜像

1
docker push [IMAGE_NAME]

5.推送指定版本镜像

1
docker push [IMAGE_NAME]:[TAG]

6.将镜像打包成压缩文件

1
docker save -o [FILE_NAME] [IMAGE_NAME]/[IMAGE_ID]

7.将压缩包加载为镜像

1
docker load -i [FILE_NAME]

8.删除镜像

1
docker rmi [IMAGE_NAME]/[IMAGE_ID]

9.强制删除镜像

1
docker rmi -f [IMAGE_NAME]/[IMAGE_ID]

容器指令

1.查看正在运行的容器

1
docker ps

2.查看所有容器

1
docker ps -a

3.启动一个或多个容器

1
docker start [OPTIONS] [CONTAINER_NAME...]/[CONTAINER_ID...]

4.停止或运行多个容器

1
docker stop [OPTIONS] [CONTAINER_NAME...]/[CONTAINER_ID...]

5.重启一个或多个容器

1
docker restart [OPTIONS] [CONTAINER_NAME...]/[CONTAINER_ID...]

6.暂停一个或多个容器中的所有进程

1
docker pause [CONTAINER_NAME...]/[CONTAINER_ID...]

7.恢复一个或多个容器

1
docker unpause [CONTAINER_NAME...]/[CONTAINER_ID...]

8.删除一个或多个容器

1
docker rm [OPTIONS] [CONTAINER_NAME...]/[CONTAINER_ID...]

9.查询容器详情

1
docker inspect [CONTAINER_NAME...]/[CONTAINER_ID...]

10.运行容器

1
docker run [OPTIONS] [IMAGE_NAME] [ARG]

运行参数解析和示例

1
2
3
4
5
6
7
8
9
10
11
OPTIONS:作为运行容器的选项,可以添加多个选项来配置容器的运行
-d:在后台运行容器
-it:使用交互式终端运行容器
-p:将容器端口映射到宿主机端口,冒号前面是宿主机端口,冒号后面是容器端口
--name:为容器指定一个名称
-e:配置环境变量
-v:挂载宿主机目录或数据卷到容器根部
--network:指定容器连接网络
-rm:容器退出后自动删除容器文件系统
--restart:容器退出时自动重启策略。no(默认不重启容器),always(无论什么方式退出都重启容器),on-failure(失败退出时重启),unless-stopped(除非手动重启否则默认重启容器)
--hostname:指定容器的主机名称

11.查看数据卷

1
docker volume inspect [VOLUMN_NAME]

12.删除数据卷

1
docker volumn rm [VOLUMN_NAME]

13.查询容器日志

1
docker logs [CONTAINER_NAME]/[CONTAINER_ID]

14.跟随容器日志输出

1
docker logs [CONTAINER_NAME]/[CONTAINER_ID]

15.进入容器执行指令

1
docker exec -it [CONTAINER_NAME]/[CONTAINER_ID] bash

其他指令

1.创建一个容器网络

1
docker network create [NETWORK_NAME]

2.查看容器内网络

1
docker network ls

3.查看网络数据源

1
docker network inspect [NETWORK_NAME]

4.删除网络

1
docker network rm [NETWORK_NAME]

5.Docker间的通信方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1.主机名通信
(1)同一Docker主机上的容器:当它们设置了自定义主机名,它们之间是可以进行通信的。
(2)不同Docker主机上的容器:容器在不同的主机上,他们通常无法通过主机名通信,除非在容器中配置了特殊的网络解决方案。

2.网络通信
(1)同一网络中的容器:它们之间可以通过容器名或服务名进行通信,也可以通过主机名进行互通。
(2)不同网络:它们之间无法通过网络名进行通信,除非在网络配置中设置了特殊的路由或桥接。

3.示例
(1)定义两个容器
docker run -d --name container1 -h [CONTAINER_NAME] [IMAGE_NAME]
docker run -d --name container2 -h [CONTAINER_NAME] [IMAGE_NAME]
(2)校验两个容器之间是否能够互通
docker exec -it container1 ping container2
(3)校验结果是能够互通的,为什么没有设置在相同网络下也能互通?
默认情况下,容器没有显示指定网络,会将它们连接到默认的Docker桥接网络中。推荐使用显示指定网络参数,以便更好地控制容器之间的通信和隔离。

Docker-compose

docker-compose是用来定义和运行多容器的Docker应用程序工具。通过ymal格式文件来配置引用程序所需要的所有服务。然后通过一个命令就可以从yaml文件中创建并启动所有服务。

安装docker-compose

1
sudo apt install docker-compose

创建一个docker-compose.yaml文件

1
2
3
4
5
6
7
8
9
10
11
12
version: "3"
services:
emqx:
image: "emqx/emqx:5.0.20"
ports:
- 18084:18083
- 9002:1883
- 8088:8081
- 8886:8883
volumes:
- ./logs:/opt/emqx/log
restart: always

运行docker-compose文件,根据配置内容拉取运行镜像和容器

1
docker-compose up -d

Dockerfile

Dockerfile是一个文本文件,包含构建Docker镜像的所有指令。docker通过读取Dockerfile中的指令生成镜像。docker builder build 命令用于从 Dockerfile 构建镜像。

1.构建镜像

1
docker build -t image_name:latest .

该指令会从当前目录读取 Dockerfile 并构建一个名为 image_name:latest 的镜像。 -t 指令为构建的镜像指定名称和标签。

2.获取指定目录下的Dockerfile文件构建镜像

1
docker build -f /path/Dockerfile -t iamge_name:latest .

该指令会从 /path/ 目录下读取 Dockerfile 并构建一个名为image_name:latest 的镜像

3.Docker文件

1
2
3
4
5
6
7
FROM adoptopenjdk/openjdk8  # 指定基础镜像
MAINTAINER xlb # 维护者信息
ADD main.jar app.jar # 将本地文件main.jar添加到容器
EXPOSE 9003 # 声明容器监听的端口,但是并不会实际开放端口,要实际映射端口还需要在运行容器中使用-p
ENV TZ=Asia/Shanghai # 设置环境变量指定时区
RUN sh -c 'touch /app.jar' && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone # 按顺序执行复杂指令,touch /app.jar 创建一个空的/app.jar文件,虽然已经在ADD中复制,但可以确保文件存在。ln -snf /usr/share/zoneinfo/$TZ /etc/localtime 创建一个符号链接设置容器的本地时间为指定时区,$TZ > /etc/timezone 将环境变量 TZ 的值写入 /etc/timezone 文件,记录容器的时区设置
ENTRYPOINT ["java","-jar","app.jar"] # 配置容器,使其可执行

问题梳理

1.运行docker时出现docker无权限:docker.sock: connect: permission denied
解决方式:
(1) 在命令前面使用sudo来以管理员用户身份运行:sudo docker ps
(2)将用户添加到Docker组:sudo usermod -aG docker $USER,新建新会话后生效。

场景

场景一

1.现有一个nacos容器,需要对它的配置文件进行自定义配置,但是无现成的nacos配置文件,如何对配置文件进行自定义配置?

(1)临时运行一个nacos容器

1
docker run -e MODE=standalone --name nacos-temp -d -p 8848:8848 nacos/nacos-server

(2)从容器中复制配置文件到宿主机

1
2
3
4
5
6
# 创建宿主机上的配置文件存储目录
mkdir -p /home/xlb/tool/nacos/conf
# 复制容器配置文件到宿主机
docker cp nacos-temp:/home/nacos/conf/application.properties /home/xlb/tool/nacos/conf/application.properties
# 复制容器SQL到宿主机
docker cp nacos-temp:/home/nacos/conf/schema.sql /home/xlb/tool/nacos/nacos.sql

(3)停止并删除容器

1
2
docker stop nacos-temp
docker rm nacos-temp

(4)c此时便能将容器中的文件复制出来使用。