文章目录
- 一、快速入门
-
- [1.1 安装Docker](#1.1 安装Docker)
- [1.2 部署MySQL](#1.2 部署MySQL)
- 二、Docker基础
-
- [2.1 Docker常见命令](#2.1 Docker常见命令)
- [2.2 数据卷](#2.2 数据卷)
- [2.3 本地目录挂载](#2.3 本地目录挂载)
- [2.4 自定义镜像与Docker File](#2.4 自定义镜像与Docker File)
- [2.5 网络](#2.5 网络)
- 三、项目部署
-
- [3.1 部署java应用](#3.1 部署java应用)
- [3.2 部署前端](#3.2 部署前端)
- [3.3 DockerCompose](#3.3 DockerCompose)
一、快速入门
1.1 安装Docker
安装参考Docker官方文档:https://docs.docker.com/engine/install/centos
如果系统有旧版的Docker,则先卸载:yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine配置Docker的yum库,首先安装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 -v查看:
docker images(docker启动后可查看)启动:
systemctl start docker停止:
systemctl stop docker设置开机自启:
systemctl enable docker查看docker:
docker ps(如果不报错,说明安装启动成功)配置镜像加速(以阿里云镜像加速为例)
注册阿里云账号:https://www.aliyun.com/
开通镜像服务:首页产品容器中找到阿里云的容器镜像服务,进入管理控制台,找到镜像工具、镜像加速器,从这复制加速器地址,参考操作文档配置https://cr/console.aliyun.com/cn-hangzhou/instances/mirrors
shell
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirrors.aliyuncs.com"]
}
EOF
systemctl deamon-reload
systemctl restart docker
1.2 部署MySQL
先停掉虚拟机中的MySQL,确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL:
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_RO0T_PASSWORD=123 mysqL
命令解析
docker run:创建并运行一个容器
-d:是让容器在后台运行
--name mysql:给容器起个名字,必须唯一
-p 3306:3306:设置端口映射
-e KEY=VALUE:是设置环境变量
mysql:指定运行的镜像的名字(命名规范:[repository]:[tag],如:mysql:5.7)
部署nginx:docker run -d --name nginx -p 80:80 nginx
镜像和容器
当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。
镜像仓库 :存储和管理镜像的平台,Docker官方维护了一个公共仓库:http://hub.docker.com(海外网址)
二、Docker基础
2.1 Docker常见命令
Docker最常用的命令就是操作镜像、容器的命令,详官方文档:https://docs.docker.com
| 指令 | 含义 |
|---|---|
| docker pull | 镜像仓库拉取到本地镜像 |
| docker push | 本地推到镜像仓库 |
| docker images | 查看镜像是否下载成功(启动后可查看) |
| docker rmi | 删除镜像 |
| docker build | 构建镜像(提前准备docker file) |
| docker save | 镜像打包为压缩文件(供其他人员使用,--help可查看帮助) |
| docker load | 镜像压缩包解压 |
| docker run | 创建并运行容器 |
| docker stop | 停止容器 |
| docker start | 启动容器 |
| docker ps | 查看容器运行状态 |
| docker rm | 删除容器 |
| docker logs | 查看日志 |
| docker exec | 进入容器内部 |
举例
拉取nginx镜像:
docker pull nginx查看本地镜像列表:
docker images容器打包为压缩包:
docker save -o nginx.tar nginx:latest(压缩包可以直接解压使用)删除镜像:
docker rmi nginx:latest查看本地镜像:
docker images解压读取镜像压缩包:
docker load -i nginx.tar(通过docker save报错的压缩包)创建并运行Nginx容器:
docker run -d --name nginx -p 80:80 nginx查看容器:
docker ps停止容器:
docker stop再次启动容器:
docker start查看日志:
docker logs nginx进入Nginx容器:
docker exec -it nginx bash删除容器:
docker rm nginx
2.2 数据卷
案例 :利用Nginx容器部署静态资源
需求 :创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
将静态资源部署到nginx的html目录
进入容器:docker exec -it nginx bash进入静态文件目录:cd /usr/share/nginx/html(里面有index.html)
使用vi修改文件时,发现无法使用vi指令
这里就要用到这节中的数据卷
数据卷
数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
两者双向绑定,即在宿主机器中创建文件,容器对应的目录也会有对应的文件操作
| 命令 | 说明 |
|---|---|
| docker volume --help | 查看帮助 |
| docker volume create | 创建数据卷 |
| docker volume ls | 查看所欲数据卷 |
| docker volume rm | 删除指定数据卷 |
| docker volume inspect | 查看某个数据卷详情 |
| docker volume prune | 清除数据卷 |
提示
在执行docker run命令时,使用
-v 数据卷:容器内目录可以完成数据卷挂载当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷
要完成案例对应的需求,进行如下操作创建并启动nginx:
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx(-v指定数据卷映射)查看数据卷:
docker volume ls查看html数据卷详细信息:
docker volume inspect html(展示宿主机器对应位置)进入宿主机器html的位置:
cd /var/lib/docker/volumes/html/_data查看当前路径信息:
ls(发现当前有index.html文件,该文件是nginx的欢迎页)修改该index.html内容后,页面访问nginx:
192.168.0.101(发现访问的页面改了)
宿主机器与容器当中,只要有一边发生改动,另一侧会同步更新,两者双向映射
2.3 本地目录挂载
案例 :mysql容器的数据挂载
需求 :查看mysql容器,判断是否有数据卷挂载
基于宿主机目录实现MySQL数据目录、配置文件、初始化脚本的挂载(查阅官方镜像文档)
提示在执行docker run命令时,使用
-v 本地目录:容器内目录可以完成本地目录挂载本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
查看mysql是否挂载数据卷:docker inspect mysql(Mounts是挂载相关信息)(mysql自带匿名数据卷挂载)
挂载/root/mysql/data到容器内的/var/lib/mysql目录挂载/root/mysql/init到容器内的/docker-entrypoint-initdb.d目录,携带课前资料准备的SQL脚本
挂载/root/mysql/conf到容器内的/etc/mysql/conf.d目录,携带课前资料准备的配置文件
要完成案例对应的需求,进行如下操作宿主机器创建目录:
mkdir -p /mysql/{data,conf,init},cd /mysql准备文件到目录:
/mysql/config/config.cnf配置文件,/mysql/init/sql.sql数据库初始化脚本,如建表创建并启动mysql:docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=123 -v /root/mysql/data:/var/lib/mysql -v /root/mysql/init:/docker-entrypoint-initdb.d -v /root/mysql/conf:/etc/mysql/conf.d mysql
config.cnf配置文件内容如下
shell
[client]
default_character_set=utf8mb4
[mysql]
default_character_set=utf8mb4
[mysqld]
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
2.4 自定义镜像与Docker File
自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
部署一个java应用的步骤:准备一个Linux服务器
安装JRE并配置环境变量
拷贝Jar包
运行Jar包
构建一个java镜像的步骤:准备一个Linux运行环境
安装JRE并配置环境变量
拷贝Jar包
编写运行脚本
入口:镜像运行入口,一般是程序启动的脚本和参数层:添加安装包、依赖、配置等,每次操作都形成新的一层
基础镜像:应用依赖的系统函数、环境、配置、文件等
Docker File
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮我们构建镜像。常见指令如下:
| 指令 | 说明 | 示例 |
|---|---|---|
| FROM | 指定基础镜像 | FROM centos:6 |
| ENV | 设置环境变量,可在后面指令使用 | ENV key value |
| COPY | 拷贝本地文件到镜像指定目录 | COPY ./jre.tar.gz /tmp |
| RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jre11.tar.gz&& EXPORTS path=/tmp/jre:$path |
| EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
| ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
更新详细语法说明,请参考官网文档:https://docs.docker.com/engine/reference/builder
我们可以基于Ubuntu基础镜像,利用Dockerfile描述镜像结构
shell
#指定基础镜像
FROM ubuntu:16.04
#配置环境变量,JDK的安装目录、容器内时区
ENV JAVA_DIR=/uSr/local
#拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
#安装JDK
RUN cd $JAVA_DIR \ && tar -xf ./jdk8.tar.gz && mv ./jdk1.8.0_144 ./java8
#配置环境变量
ENV JAVA_HOME=$JAVA_DIR/jaVa8
ENV PATH=$PATH:$JAVA_HOME/bin
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
也可以直接基于JDK为基础镜像,省略前面的步骤
shell
#基础镜像
FROM openjdk:11.0-jre-buster
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
编写好了Dockerfile,可以利用下面命令来构建镜像:
docker build -t myImage:1.0 .
-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
.:是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
举例:提前准备docker-demo.jar包
shell
#基础镜像
FROM openjdk:11.0-jre-buster
#设定时区
ENV TZ=Asia/Shanghai
RUN In -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone
#拷贝jar包
COPY docker-demo.jar /app.jar
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
构建镜像:
docker build -t docker-demo .运行:docker run -d --name dd -p 8080:8080 docker-demo
查看日志:docker logs -f dd
浏览器访问:xxx.xxx.xxx.xxx:8080
2.5 网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上
加入自定义网络的容器才可以通过容器名互相访问,Docker的网络操作命令如下
| 命令 | 说明 |
|---|---|
| docker network create | 创建一个网络 |
| docker network ls | 查看所有网络 |
| docker network rm | 删除指定网络 |
| docker network prune | 清除未使用的网络 |
| docker network connect | 使指定容器连接加入某网络 |
| docker network disconnect | 使指定容器连接离开某网络 |
| docker network inspect | 查看网络详细信息 |
查看所以网络:
docker network ls创建网络:
docker network create demo查看网卡:
ip addr(发现多了个网卡)容器加入网络:
docker network connect demo mysql查看mysql:
docker inspect mysql(里面有新建的网络)创建容器时就连接网络:
docker run -d --name dd -p 8080:8080 --network demo docker-demo( --network demo指定demo网络)查看:
docker inspect dd(只有这一个网络,没有默认的虚拟网桥)
三、项目部署
3.1 部署java应用
需求:将demo-project项目打包为镜像并部署,镜像名demo-project
将项目打包target中的压缩包和dockerfile放到机器中dockerfile内容如下:
shell
#基础镜像
FROM openjdk:11.0-jre-buster
#设定时区
ENV TZ=Asia/Shanghai
RUN In -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone
#拷贝jar包
COPY demo-project.jar /app.jar
#入口,java项目的启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
构建镜像:
docker build -t demo .创建并启动容器:
docker run -d --name demo-project -p 8080:8080 --network demo-network demo-project查看日志:
docker logs -f demo-project
3.2 部署前端
需求:创建一个新的nginx容器,准备nginx.conf(nginx的配置)、html目录与容器挂载
nginx.conf部分内容如下
shell
http {
include mime.types;
default_type application/json;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
# 指定前端项目所在的位置
location / {
root /usr/share/nginx/html/demo-project;
}
error_page 599 592 593 594 /50x.html;
location = /50x.html {
root html;
}
# 后台接口配置
location /api {
rewrite /api/(.*) /$1 break;
proxy_pass http://demo-project:8080;
}
}
}
把项目和nginx.conf发到机器中
创建并运行nginx:
docker run -d --name nginx -p 80:80 -v /root/nginx/html:/usr/share/nginx/html -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf --network demo nginx
3.3 DockerCompose
Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现
多个相互关联的Docker容器的快速部署。
当前方式:docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_RO0T_PASSWORD=123 -v ./mysql/data:/var/lib/mysql -v ./mysql/conf:/etc/mysql/conf.d \-v ./mysql/init:/docker-entrypoint-initdb.d --network demo mysql
DockerCompose方式创建,即yaml格式
yaml
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_RO0OT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
-"./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- demo
yaml多容器样式
yaml
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3306:3306"
environment:
TZ: Asia/Shanghai
MYSQL_RO0OT_PASSWORD: 123
volumes:
- "./mysql/conf:/etc/mysql/conf.d"
-"./mysql/data:/var/lib/mysql"
- "./mysql/init:/docker-entrypoint-initdb.d"
networks:
- demo
demo-project: # java应用程序
build:
context: .
dockerfile: Dockerfile
container_name: demo-project
ports:
- "8080:8080"
networks:
- demo
depends_on:
- mysql
nginx:
image: nginx
container_name: nginx
ports:
- "80:80"
volumes:
- "./nginx/nginx.conf:/etc/nginx/nginx.conf"
- "./nginx/html:/usr/share/nginx/html"
depends_on:
- demo-project
networks:
- demo
networks:
demo-net:
name: demo
指令格式:docker compose [OPTIONS] [COMMAND]
Options类型参数
| 参数或命令 | 说明 |
|---|---|
| -f | 指定compose文件的路径和名称 |
| -p | 指定project名称 |
Commands类型参数
| 参数或命令 | 说明 |
|---|---|
| up | 创建并启动所有service容器 |
| down | 停止并移除所有容器、网络 |
| ps | 列出所有启动的容器 |
| logs | 查看指定容器的日志 |
| stop | 停止容器 |
| start | 启动容器 |
| restart | 重启容器 |
| top | 查看运行的进程 |
| exec | 在指定的运行中容器中执行命令 |
创建:
docker compose up -d查看:
docker compose ps网页可以访问
终止:docker compose down
查看:docker network ls