Docker入门
Docker安装
Centos7卸载已有docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装yum
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装docker
sudo yum install 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
配置镜像加速
注册阿里云账号,产品-容器-容器镜像服务ACR-管理控制台-镜像工具
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker快速入门
镜像和容器
当我们利用Docker安装应用时,Docker会自动搜索并下载引用镜像(image),镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)
镜像仓库: 存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub
部署MySQL
先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asis/Shanghai \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql
命令解读
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asis/Shanghai \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql
- docker run:创建并运行一个容器,-d是让容器在后台运行
- --name mysql:给容器起个名字,必须唯一
- -p 3306:3306:设置端口映射(Docker内部会有单独的网络环境),第一个是宿主机端口,第二个是不用改变的
- -e KEY=VALUE:是设置环境变量
- mysql:指定运行的镜像的名字
- 镜像名称一般分两部分组成:[repository]:[tag]
- repository就是镜像名
- tag是镜像的版本
- 在没有指定tag时,默认是latest,代表最新版本的镜像
- 镜像名称一般分两部分组成:[repository]:[tag]
Docker基础
常见命令
Docker最常见的命令就是操作镜像、容器的命令,详见官方文档:docs.docker.com/
- docker pull 从镜像仓库拉取镜像
- docker images 查看所有的本地镜像
- docker rmi 删除镜像
- docker build 构建镜像
- docker save 保存镜像
- docker load 加载镜像
- docker push 推送镜像仓库
- docker run 创建并运行容器
- docker stop 停止容器内部进程
- docker start 启动已经停止的容器
- docker ps 查看当前容器状态
- docker rm 删除容器
- docker logs 查看容器运行日志
- docker exec 进入容器内部
数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
| 命令 | 说明 |
|---|---|
| docker volume create | 创建数据卷 |
| docker volume ls | 查看所有数据卷 |
| docker volume rm | 删除指定数据卷 |
| docker volume inspect | 查看某个数据卷的详情 |
| docker volume prunc | 清除数据卷 |
- 在执行docker run命令时,使用**-v 数据卷:容器内目录**可以完成数据卷挂载
- 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
若要自己指定挂在目录
- 在执行docker run 命令时,使用**-v 本地目录:容器内目录**可以完成本地目录挂载
- 本地目录必须以"/"或者"./"开头,如果直接以名称开头,会被识别为数据按而非本地目录
- -v mysql:/var/lib/mysql会被识别为一个数据卷叫mysql
- -v ./mysql:/var/lib/mysql会被识别为当前目录下的mysql目录
例如挂载MySQL的数据卷
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asis/Shanghai \
-e MYSQL_ROOT_PASSWORD=1234 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
-v /root/mysql/conf:/etc/mysql\conf.d \
mysql
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库,运行配置等文件的文件包,构建镜像的过程其实就是把上述文件打包的过程
层(Layer): 添加安装包、依赖、配置等,每次操作都形成新的一层
基础镜像(BaseImage): 应用依赖的系统函数库、环境、配置、文件等
入口(Entrypoint): 镜像运行入口,一般是程序启动的脚本和参数
Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用来指令说明要执行什么操作来构建镜像,将来Docker可以根据Dockerfile帮我们构建镜像,常用指令如下:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:6 |
| ENV | 设置环境变量,可以在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jrell.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jrell.tar.gz && EXPORTS path=/tmp/jrell:$path |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
更新详细语法说明,请参考官网文档:docs.docker.com/engine/refe…
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构,也可以直接基于JDK为基础镜像,省略前面的步骤
当编写好了Dockerfile,可以利用下面的命令来构建镜像:
docker build -t myInage:1.0 .
- -t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
- .:是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上,相互之间通过ip可以访问的对方,但是在实际过程中,ip地址可能会随着启动时间变化,为了解决这种方法,可以使用自定义网络
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下:
| 命令 | 说明 |
|---|---|
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用的网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
DockerCompose
DockerCompose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Dokcer容器的快速部署。
文件样例如下:
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
- "./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- hm-net
hmall:
build:
context: .
dockerfile: Dockerfile
container_name: hmall
ports:
- "8080:8080"
networks:
- hm-net
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "18080:18080"
- "18081:18081"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- hmall
networks:
- hm-net
networks:
hm-net:
name: hmall
Docker compose的命令格式如下:
docker compose [OPTIONS] [COMMAND]
| 类型 | 参数或指令 | 说明 |
|---|---|---|
| Options | -f | 指定compose文件的路径和名称 |
| Options | -p | 指定project名称 |
| Commands | up | 创建并启动所有service容器 |
| Commands | down | 停止并移除所有容器、网络 |
| Commands | ps | 列出所有启动的容器 |
| Commands | logs | 查看指定容器的日志 |
| Commands | stop | 停止容器 |
| Commands | start | 启动容器 |
| Commands | restart | 重启容器 |
| Commands | top | 查看运行的进程 |
| Commands | exec | 在指定的运行中容器中执行命令 |