一、准备工作
1.配置Docker的yum库
首先要安装一个yum工具
yum install -y yum-utils
安装成功后,执行命令,配置Docker的yum源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
2.安装Docker
执行命令,安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.启动和校验
# 启动Docker
systemctl start docker# 停止Docker
systemctl stop docker# 重启
systemctl restart docker# 设置开机自启
systemctl enable docker# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
4.配置镜像加速
4.1注册阿里云账号
首先访问阿里云网站: https://www.aliyun.com/ 注册一个账号。
4.2开通镜像服务
在首页的产品中,找到阿里云的容器镜像服务:
点击后进入控制台:
首次可能需要选择立刻开通,然后进入控制台。
4.3.配置镜像加速
找到镜像工具下的镜像加速器:
页面向下滚动,即可找到配置的文档说明:
具体命令如下:
# 创建目录
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
二、准备工作
1.常见的命令介绍
命令 | 说明 | 文档地址 |
---|---|---|
docker pull | 拉取镜像 | docker pull |
docker push | 推送镜像到DockerRegistry | docker push |
docker images | 查看本地镜像 | docker images |
docker rmi | 删除本地镜像 | docker rmi |
docker run | 创建并运行容器(不能重复创建) | docker run |
docker stop | 停止指定容器 | docker stop |
docker start | 启动指定容器 | docker start |
docker restart | 重新启动容器 | docker restart |
docker rm | 删除指定容器 | docs.docker.com |
docker ps | 查看容器 | docker ps |
docker logs | 查看容器运行日志 | docker logs |
docker exec | 进入容器 | docker exec |
docker save | 保存镜像到本地压缩文件 | docker save |
docker load | 加载本地压缩文件到镜像 | docker load |
docker inspect | 查看容器详细信息 | docker inspect |
用一副图来表示这些命令的关系:
补充:
默认情况下,每次重启虚拟机我们都需要手动启动Docker和Docker中的容器。通过命令可以实现开机自启:
# Docker开机自启
systemctl enable docker# Docker容器开机自启
docker update --restart=always [容器名/容器id]
2.演示
以Nginx为例给大家演示上述命令:DockerHub网址:https://hub-stage.docker.com/search
第1步,去DockerHub查看nginx镜像仓库及相关信息
第2步,拉取Nginx镜像
docker pull nginx
第3步,查看镜像
docker images
# 第4步,创建并允许Nginx容器
docker run -d --name nginx -p 80:80 nginx
命令说明:
d
: 表示容器后台运行--name
:容器名,可以任意,不可重复-p
:端口映射,前面80表示宿主机的端口,后面80表示容器的端口,容器是隔离环境,即容器内不做端口映射是无法访问到的,上述映射关系即所有请求到宿主机80端口的请求会转发到容器的80端口
nginx : 前面加载的镜像名
第5步,查看运行中容器
docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
第6步,停止容器
docker stop nginx
第7步,再次启动nginx容器
docker start nginx
第8步,查看容器详细信息
docker inspect nginx
第9步,进入容器,查看容器内目录
docker exec -it nginx bash
第10步,删除容器
docker rm nginx
发现无法删除,因为容器运行中,强制删除容器
docker rm -f nginx
3.命令别名
给常用Docker命令起别名,方便我们访问:
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"'
alias dis='docker images'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi
然后,执行命令使别名生效
source /root/.bashrc
现在,就可以使用快捷命令查看镜像和容器了:
三、数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机****目录之间映射的桥梁。类似与宿主机与容器端口映射
以Nginx为例,我们知道Nginx中有两个关键的目录:
html
:放置一些静态资源conf
:放置配置文件
如果我们要让Nginx代理我们的静态资源,最好是放到html
目录;如果我们要修改Nginx的配置,最好是找到conf
下的nginx.conf
文件。
但遗憾的是,容器运行的Nginx所有的文件都在容器内部。所以我们必须利用数据卷将两个目录与宿主机目录关联,方便我们操作。如图:
在上图中:
- 我们创建了两个数据卷:
conf
、html
- Nginx容器内部的
conf
目录和html
目录分别与两个数据卷关联。 - 而数据卷conf和html分别指向了宿主机的
/var/lib/docker/volumes/conf/_data
目录和/var/lib/docker/volumes/html/_data
目录
这样以来,容器内的conf
和html
目录就 与宿主机的conf
和html
目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data
就是在操作容器内的/usr/share/nginx/html/_data
目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
3.1.数据卷命令
命令 | 说明 | 文档地址 |
---|---|---|
docker volume create | 创建数据卷 | docker volume create |
docker volume ls | 查看所有数据卷 | docs.docker.com |
docker volume rm | 删除指定数据卷 | docs.docker.com |
docker volume inspect | 查看某个数据卷的详情 | docs.docker.com |
docker volume prune | 清除数据卷 | docker volume prune |
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
演示环节:演示一下nginx的html目录挂载:
1.首先查看以下已有的数据集
docker volume ls
容器默认创建的数据卷:
2.然后创建一个自己的数据卷
docker volume create html
# 查看数据卷
docker volume ls
3.创建容器并指定数据卷,注意通过 -v 参数来指定数据卷
docker run -d --name qknginx -p 80:80 -v html:/usr/share/nginx/html nginx
命令说明:
-v
: 表示数据卷挂载html
:之前创建的数据卷/usr/share/nginx/html
:qknginx这个容器内的映射路径,容器的所有数据卷映射路径都在宿主机的/var/lib/docker/volumes目录下
cd /var/lib/docker/volumes/html/_data/
3.查看数据卷详情
docker volume inspect html
查看容器详情:
docker inspect qknginx
可以看到数据卷挂载情况:
也可以进入到容器里相应的目录下查看:
可以看到宿主机目录下文件和容器内文件一模一样,可以宿主机内修改文件,查看页面情况。
3.2.挂载本地目录或文件
上述情况演示的是数据卷挂载的一种方式,我们也可以在创建运行容器的时候直接把本地路径与容器路径做映射:
演示,删除并重新创建mysql容器,并完成本地目录挂载:
-
挂载
/root/mysql/data
到容器内的/var/lib/mysql
目录 -
挂载
/root/mysql/init
到容器内的/docker-entrypoint-initdb.d
目录(初始化的SQL脚本目录) -
挂载
/root/mysql/conf
到容器内的/etc/mysql/conf.d
目录(这个是MySQL配置文件目录)3.2.1 本地先创建3个目录
mkdir -p /mysql/data mkdir -p /mysql/init mkdir -p /mysql/conf
3.2.2 创建容器并挂载数据卷
1.删除原来的MySQL容器
docker rm -f mysql
2.进入root目录
cd ~
3.创建并运行新mysql容器,挂载本地目录
docker run -d \--name mysql \-p 3306:3306 \-e TZ=Asia/Shanghai \-e MYSQL_ROOT_PASSWORD=1234 \-v ./mysql/data:/var/lib/mysql \-v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d \mysql
4.查看root目录,可以发现~/mysql/data目录已经自动创建好了
ll mysql
结果:
总用量 4 drwxr-xr-x. 2 root root 20 5月 19 15:11 conf drwxr-xr-x. 7 polkitd root 4096 5月 19 15:11 data drwxr-xr-x. 2 root root 23 5月 19 15:11 init
使用navicat连接工具查看:数据库初始化完成(备注:我在mysql/init和/mysql/config目录下放了自己的一些初始化数据,你也可以放一些自己初始化数据到相应的目录下)
四、镜像
前面我们一直在使用别人准备好的镜像,那如果我要部署一个Java项目,把它打包为一个镜像该怎么做呢?
举个例子,我们要从0部署一个Java应用,大概流程是这样:
-
准备一个linux服务(CentOS或者Ubuntu均可)
-
安装并配置JDK
-
上传Jar包
-
运行jar包
那因此,我们打包镜像也是分成这么几步:
4.1.提前准备好一个基础镜像
4.2.加载镜像文件
docker load -i jdk.tar
4.3.制作DockerFile
# 基础镜像
FROM openjdk:11.0-jre-buster
# 设定时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷贝jar包
COPY docker-demo.jar /app.jar
# 入口
ENTRYPOINT ["java", "-jar", "/app.jar"]
4.4.构建镜像
docker build -t qkjdk:202424 .
命令说明:
docker build
: 就是构建一个docker镜像-t qkjdk:202424
:-t
参数是指定镜像的名称(repository
和tag
).
: 最后的点是指构建时Dockerfile所在路径,由于我们进入了demo目录,所以指定的是.
代表当前目录,也可以直接指定Dockerfile目录:-
# 直接指定Dockerfile目录 docker build -t qkjdk:202424 /home/qk
-
4.4.查看构建的镜像
docker images
4.5.然后尝试运行该镜像
docker run -d --name kk -p 8080:8080 qkjdk:202424
4.6.最后,导出镜像文件
docker export -o testjdk.tar kk
命令说明:
docker export
: 就是导出docker镜像-o testjdk.tar
:-o
参数tar文件的名称kk
: 最后的kk就是容器名称
可以看出镜像文件已经被导出为testjdk.tar
4.7.重新加载运行导出的镜像
docker import testjdk.tar bsp-as-is:2024jdk
命令说明:
docker import
: 就是导入docker镜像文件testjdk.tar
:镜像文件压缩包文件的名称bsp-as-is:2024jdk
:repository
和tag
# 1.使用下面的命令创建并运行容器
docker run -itd --name qkjdk bsp-as-is:2024jdk /bin/bash
# 2.查看运行的容器
docker ps
# 结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab55427e7d1e bsp-as-is:2024jdk "/bin/bash" 8 seconds ago Up 7 seconds qkjdk
c60db535f84d mysql "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp qkmysql
b2b17b941c44 nginx "/docker-entrypoint.…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp, :::80->80/tcp qknginx
# 3.进入容器
docker exec -it qkjdk bash
注意:Docker容器运行错误分析
当您在运行Docker容器时出现"docker: Error response from daemon: No command specified"错误时,这意味着您没有在命令中指定容器要运行的命令。每个容器都需要一个命令来执行,否则Docker将无法启动容器。
解决方法
要解决这个问题,您需要在运行容器时指定要在其中执行的命令。
以下是几个示例:1.运行一个交互式的容器
如果您希望在容器中运行交互式命令行会话,可以使用it选项来启动容器,并在命令中指定要运行的Shell:
docker run -itd --name qkjdk bsp-as-is:2024jdk /bin/bash
这将在容器中启动一个交互式的Bash会话。
五、网路
容器是隔离环境,在创建容器的时候,容器会创建一个默认的网桥:
docker inspect qkjdk
同一网段的容器之间可以相互访问,但是不同网段的容器就无法访问,此时就需要自定义一个网桥,同一网桥下的容器之间可以相互访问
网络常见命令有:
命令 | 说明 | 文档地址 |
---|---|---|
docker network create | 创建一个网络 | docker network create |
docker network ls | 查看所有网络 | docs.docker.com |
docker network rm | 删除指定网络 | docs.docker.com |
docker network prune | 清除未使用的网络 | docs.docker.com |
docker network connect | 使指定容器连接加入某网络 | docs.docker.com |
docker network disconnect | 使指定容器连接离开某网络 | docker network disconnect |
docker network inspect | 查看网络详细信息 | docker network inspect |
5.1.当前宿主机下的所有网桥:
5.2.创建一个网桥
docker network create qqnet
5.3.为容器分配一个网桥
docker network connect qknet qkjdk
命令说明:
-
docker network connect
: 使指定容器连接加入某网络 -
qknet
:网桥名称 -
qkjdk
: 容器名称查看qkjdk容器的详情
5.4.在容器创建的时候就为其分配网桥
docker run -itd --name qkjdk --network qknet -p 8080:8080 bsp-as-is:2024jdk /bin/bash
命令说明:
-
docker run
: 运行容器 -
-itd
:后台运行容器,并指定容器的交互命令 -
--network qknet
: 容器分配的网桥名称 -
-p 8080:8080
: 宿主机与容器的端口映射 -
bsp-as-is:2024jdk
: 镜像的repository
和tag
-
/bin/bash
: 默认的交互命令查看容器详情:
docker inspect qkjdk
-
总结:
- 在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
- 在同一个自定义网络中的容器,可以通过别名互相访问