首先要安装一个yum工具
yum install -y yum-utils
安装成功后,执行命令,配置Docker的yum源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
执行命令,安装Docker
yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
首先访问阿里云网站: https://www.aliyun.com/ 注册一个账号。
在首页的产品中,找到阿里云的容器镜像服务:
点击后进入控制台:
首次可能需要选择立刻开通,然后进入控制台。
找到镜像工具下的镜像加速器:
# 创建目录
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 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]
以Nginx为例给大家演示上述命令:DockerHub网址:https://hub-stage.docker.com/search
docker pull nginx
docker images
docker run -d --name nginx -p 80:80 nginx
命令说明:
d
: 表示容器后台运行--name
:容器名,可以任意,不可重复-p
:端口映射,前面80表示宿主机的端口,后面80表示容器的端口,容器是隔离环境,即容器内不做端口映射是无法访问到的,上述映射关系即所有请求到宿主机80端口的请求会转发到容器的80端口docker ps
# 也可以加格式化方式访问,格式会更加清爽
docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"
docker stop nginx
docker start nginx
docker inspect nginx
docker exec -it nginx bash
docker rm nginx
docker rm -f nginx
给常用Docker命令起别名,方便我们访问:
# 修改/root/.bashrc文件
vi /root/.bashrc
内容如下:
# .bashrc
# User specific aliases and functions
alias 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
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代理了。
命令 | 说明 | 文档地址 |
---|---|---|
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目录挂载:
docker volume ls
容器默认创建的数据卷:
docker volume create html
# 查看数据卷
docker volume ls
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/
docker volume inspect html
查看容器详情:
docker inspect qknginx
可以看到数据卷挂载情况:
也可以进入到容器里相应的目录下查看:
可以看到宿主机目录下文件和容器内文件一模一样,可以宿主机内修改文件,查看页面情况。
上述情况演示的是数据卷挂载的一种方式,我们也可以在创建运行容器的时候直接把本地路径与容器路径做映射:
演示,删除并重新创建mysql容器,并完成本地目录挂载:
挂载/root/mysql/data
到容器内的/var/lib/mysql
目录
挂载/root/mysql/init
到容器内的/docker-entrypoint-initdb.d
目录(初始化的SQL脚本目录)
挂载/root/mysql/conf
到容器内的/etc/mysql/conf.d
目录(这个是MySQL配置文件目录)
mkdir -p /mysql/data
mkdir -p /mysql/init
mkdir -p /mysql/conf
docker rm -f mysql
cd ~
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
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包
那因此,我们打包镜像也是分成这么几步:
准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
安装并配置JDK
拷贝jar包
配置启动脚本
docker load -i jdk.tar
# 基础镜像
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"]
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
docker images
docker run -d --name kk -p 8080:8080 qkjdk:202424
docker export -o testjdk.tar kk
命令说明:
docker export
: 就是导出docker镜像-o testjdk.tar
:-o
参数tar文件的名称kk
: 最后的kk就是容器名称可以看出镜像文件已经被导出为testjdk.tar
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 |
docker network create qqnet
docker network connect qknet qkjdk
命令说明:
docker network connect
: 使指定容器连接加入某网络
qknet
:网桥名称
qkjdk
: 容器名称
docker run -itd --name qkjdk --network qknet -p 8080:8080 bsp-as-is:2024jdk /bin/bash
命令说明:
总结: