Go语言实现的开源容器项目。利用操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。它是内核级的虚拟化。期望达到使项目运行环境“一次封装,到处运行的目的”。
Docker和虚拟机(VM)是两种不同的技术,它们各自有着不同的优势和应用场景。
Docker是一种轻量级的容器技术,可以将应用及其依赖项打包到一个可移植的容器中,使得应用可以在任何环境中都能够运行。Docker容器与主机共享内核和系统资源,因此启动速度快、占用资源少、易于部署和管理。Docker还可以快速创建多个相互隔离的应用容器,每个容器都可以运行不同的应用程序或服务。它可以帮助开发人员和运维人员更加高效地部署、管理和运行应用程序。
虚拟机则是一种完整的虚拟计算机,可以模拟出一台完整的计算机系统,包括硬件、操作系统和应用程序等。每个虚拟机都有自己的操作系统内核和系统资源,因此可以运行不同的操作系统或应用程序。虚拟机通常比Docker更为灵活,但启动速度较慢,占用资源多,部署和管理也较为复杂。
综上所述
注意:Docker并不是为了替代虚拟机,虚拟机是系统级别,而Docker是应用级,各自的场景不同而已


一个Docker Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo

yum install -y yum-utils
yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7.9/x86_64/stable/Packages/containerd.io-1.4.8-3.1.el7.x86_64.rpm

yum install -y docker-ce

systemctl start docker
systemctl stop docker
systemctl status docker

docker info


docker ps

systemctl enable --now docker.service
systemctl enable --now docker.socket

systemctl enable --now docker.service和systemctl enable docker都是用来启用docker服务的命令,但是它们之间有一些不同。
Docker Hub上下载镜像资源,但速度很慢,可以通过配置国内的镜像加速器来解决。阿里云官网:https://www.aliyun.com/


选择对应的OS并配置

# sudo表示以root用户的权限进行操作(当前用户如果是root,要不要sudo都行
# 创建目录
mkdir -p /etc/docker
# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxx.mirror.aliyuncs.com"]
}
EOF
# 重新加载配置
systemctl daemon-reload
# 重启Docker
systemctl restart docker


docker images
# 或者
docker image ls

docker search 镜像名称

# 命令:(不带版本号,默认下载最新的那个(latest))
docker pull 镜像名称
# 命令(带版本号)
docker pull 镜像名 [标签]


# 删除本地镜像使用命令:
# IMAGE_ID,REPOSITORY,TAG均是images下的参数
# 根据IMAGE_ID进行删除镜像
docker rmi $IMAGE_ID
# 根据REPOSITORY进行删除镜像
docker rmi $REPOSITORY:$TAG

-f:表示强制删除

docker create [options] 镜像名字或者ID [COMMAND] [ARG...]
# 例:创建一个mysql容器
docker create -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root mysql
# 例:创建一个有映射路径的mysql容器
docker create -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
--restart=always mysql
# Docker容器开机自启
docker update --restart=always [容器名/容器id]
# --restart=always mysql表示开机自启mysql容器

--name:给容器起一个新名字。为容器指定一个名称
--restart : 设置是否重启容器自动启动,默认no always:自动重启
-i:以交互模式运行容器,通常与-t连用
-t:为容器重新分配一个伪终端,通常与-i连用
-P:随机端口映射
-p:指定端口映射,hostPost:containerPort
-e:配置信息
-d:后台执行(创建并启动时候)
-v:主机和容器的目录映射关系,":"前为主机目录,之后为容器目录
docker start 容器ID/容器名
# 例子:
docker start mysql

docker stop 容器ID/容器名
# 例子:
docker stop mysql

docker run [options] 镜像名字或者ID [COMMAND] [ARG...]
# 例:创建一个mysql容器并且在后台运行(-d)
docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql
# 例:创建一个有映射路径的mysql容器并且在后台运行(-d)
docker run -p 3306:3306 --name mysql_new -e MYSQL_ROOT_PASSWORD=root \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
--restart=always -d mysql
docker container ls
docker ps [options]

-l:显示最近创建的容器
-n 数字:显示最近n个创建的容器
-a:列出所有的容器
-q:列出容器id
docker container ls -a
# 语法:
docker kill 容器ID或名称
# 示例:
docker kill mysql
# 语法:
docker pause 容器ID或名称
# 示例:
docker pause mysql
# 语法:
docker unpause 容器ID或名称
# 示例:
docker unpause mysql
# 语法:
docker rm 容器ID或名称
# 示例:
docker rm mysql
# 语法:
docker logs -f -t --tail 行数 容器ID
# 示例:
docker logs -f -t --tail 5 mysql
参数说明
-f 参数代表长期监控日志数据
-t 额外增加时间戳
--tail 行数 显示末尾多少行日志

# 语法:
docker top 容器ID或名称
# 示例:
docker top mysql

# 语法:
docker inspect 容器ID或名称
# 示例:
docker inspect mysql

# 语法:
docker cp 容器ID或名称:容器内路径 宿主机路径
# 示例:复制MySQL配置到宿主机:
docker cp mysql:/etc/mysql ~/tmp/conf
# 语法:
docker exec [options] 容器ID [command]
# 示例:
docker exec -it mysql bash

可以把容器理解成简易版的Linux环境(包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
-i:以交互模式运行容器,通常与-t连用
-t:为容器重新分配一个伪终端,通常与-i连用
思考几个问题:
如果要升级MySQL版本,需要销毁旧容器,那么数据岂不是跟着被销毁了?容器内目录与宿主机目录(当前虚拟机操作的linux系统的目录)之间映射的桥梁。/var/lib/docker/volumes这个目录就是默认的存放所有容器数据卷的目录容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,这样我们就可以通过操作宿主机目录去关联操作到容器的目录了(两个目录关联后,宿主机目录变化,容器目录也会跟着变化)。
静态资源放入宿主机对应目录,就可以被Nginx容器代理了。由于容器一旦创建,目录挂载就无法修改,这样容器就无法正常工作了。不过,我们通过由于数据卷目录比较深,不好寻找,通常我们也允许让容器直接与宿主机目录挂载而不使用数据卷
# 创建数据卷
docker volume create 数据卷名称
# 查看所有数据卷
docker volume ls
# 删除指定数据卷
docker volume rm 数据卷名称
# 查看某个数据卷的详情
docker volume inspect 数据卷名称
# 清除数据卷
docker volume prune 数据卷名称

注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且在创建容器的过程中,如果挂载了数据卷且数据卷不存在,数据卷会自动创建。
# 创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
# 这里的html就是数据卷的名称,数据卷默认的存放位置是/var/lib/docker/volumes这个目录
# 创建容器没有指定数据卷
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
在创建容器时,如果没有定义数据卷,会默认创建一个匿名数据卷。
数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:# 挂载本地目录
-v 本地目录:容器内目录
# 挂载本地文件
-v 本地文件:容器内文件
注意:本地目录或文件必须以 / 或 ./开头,如果直接以名字开头,会被识别为数据卷名而非本地目录名。-v mysql:/var/lib/mysql
# 会被识别为一个数据卷叫mysql,运行时会自动创建这个数据卷
-v ./mysql:/var/lib/mysql
# 会被识别为当前目录下的mysql目录,运行时如果不存在会创建目录
数据卷是由Docker管理的,而挂载目录是直接将主机目录挂载到容器中。
当前以部署一个普通的springboot项目为例。
创建目录命令
mkdir -p /usr/local/docker-app/springboot_demo/
# 查看有哪些openjdk的镜像可以下载(拉取)
docker search openjdk #(不指定版本就是下载最新的)
# 拉取镜像
docker pull openjdk
# 使用vi编辑器进入Dockerfile
vi Dockerfile
# Dockerfile里面要写的内容
FROM openjdk:8
ADD springboot_demo01-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]
EXPOSE 8761
#指定基础镜像,这个需要根据自己配置的仓库上的版本写
FROM openjdk:8
#指定源包,赋值到容器,前者是你的jar包,后面是别名
ADD spring_boot_demo01-1.0-SNAPSHOT.jar app.jar
#指定容器启动时执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
#对外端口
EXPOSE 8080
# 语法:
docker build -f 构建文件 -t 镜像名称:TAG 相对目录(如果是镜像构建当前目录就是点)
# 示例:
docker build -f /usr/local/docker-app/springboot_demo/buildFile -t springbootdemo:1.0 .
docker run --name springbootdemo -p 8080:8080 -d springbootdemo:1.0

vim /usr/lib/systemd/system/docker.service
-H unix:///var/run/docker.sock -H 0.0.0.0:2375
参数说明
-H unix:///var/run/docker.sock : 开启一个对外主机服务,使用docker.sock文件管理。
-H 0.0.0.0:2375 : 允许什么客户端IP访问当前服务,当前服务对外暴露的端口号是什么。端口可自定义。

# 重新加载配置
systemctl daemon-reload
# 重新启动docker
systemctl restart docker
<plugin>
<groupId>com.spotifygroupId>
<artifactId>docker-maven-pluginartifactId>
<version>1.2.2version>
<configuration>
<imageName>springboot_demo:1.0imageName>
<baseImage>openjdk:latestbaseImage>
<dockerHost>http://192.168.126.10:2375dockerHost>
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]entryPoint>
<exposes>
<expose>8080expose>
exposes>
<resources>
<resource>
<targetPath>/targetPath>
<directory>${project.build.directory}directory>
<include>${project.build.finalName}.jarinclude>
resource>
resources>
configuration>
plugin>







YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
mv docker-compose-linux-x86_64 docker-compose

sudo chmod +x /usr/local/bin/docker-compose

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

输入docker-compose version 命令
docker-compose version

示例:使用docker-compose方式来创建一个mysql的容器
mkdir -p /home/docker/compose
cd /home/docker/compose
# 在这个目录下 /home/docker/compose 创建mysql
mkdir mysql


touch docker-compose.yml

version: '1.0' #版本,可以任意给
services: #配置服务 s 代表负数,下面可以配置多个容器信息
mysql1: #自定义服务名称,随意(见名知意)
image: mysql:latest #镜像以及版本,当前mysql
container_name: mysql1 #容器名称
restart: always #是否跟随系统启动自动启动
ports: #端口映射
- 3311:3306
volumes: #容器卷映射。是否映射要看
- /root/docker-compose/mysql1/data:/var/lib/mysql-compose
- /root/docker-compose/mysql1/config:/etc/mysql-compose
environment: #mysql的环境配置
MYSQL_ROOT_PASSWORD: 123456

参数的说明
-version 文件格式的版本
services 配置服务 s 代表负数,下面可以配置多个容器信息
container_name 服务定义, mysql1 是容器的名称
image nginx容器所使用的镜像:版本
ports 定义端口映射,宿主机对外暴露的端口:容器端口
volumes 目录映射
docker-compose.yml配置很多,具体配置根据实际情况选择即可
docker-compose.yml文件官方文档
docker compose up -d

options参数说明
1. up 表示启动
2. -d 表示后台运行
3. -f 指定 docker-compose 文件位置 docker-compose -f /root/docker-compose/docker-compose.yml up -d
在 docker-compose.yml 文件所在目录执行
docker-compose up -d
docker-compose down
docker-compose restart
# 重新加载创建容器
docker-compose up --force-recreate -d
version: '1.0' #版本,可以任意给
services: #配置服务 s 代表负数,下面可以配置多个容器信息
mysql22: #自定义服务名称,随意(见名知意)
image: mysql:latest #镜像以及版本,当前mysql
container_name: mysql22 #容器名称
restart: always #是否跟随系统启动自动启动
ports: #端口映射
- 3322:3306
volumes: #容器卷映射。是否映射要看
- /root/docker-compose/mysql22/data:/var/lib/mysql-compose
- /root/docker-compose/mysql22/config/my.cnf:/etc/mysql-compose/my.cnf
environment: #mysql的环境配置
MYSQL_ROOT_PASSWORD: 123456
mysql23:
image: mysql:latest
container_name: mysql23
restart: always #是否跟随系统启动自动启动
ports:
- 3323:3306
volumes:
- /root/docker-compose/mysql23/data:/var/lib/mysql-compose
- /root/docker-compose/mysql23/config/my.cnf:/etc/mysql-compose/my.cnf
environment:
MYSQL_ROOT_PASSWORD: 123456


测试连接:

