1. Ubuntu安装Docker
默认安装位置:/var/lib/docker
该目录下的子目录:
- containers: 每个运行的容器的元数据和日志
- image: 镜像相关的数据
- volumes: 数据卷挂载的持久化数据
- overlay2: 容器的文件系统
- network: 网络配置文件
- tmp: 临时数据
# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
2. 快速入门
2.1 Docker部署MySQL
注意:运行下面的命令,需要开梯子
docker run -d \
--name mysql \
-p 3307:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
运行完毕之后:
客户端连接mysql测试

连接成功!!!

- 镜像image下载一次
- 容器containers启动多次
-
Docker 中拉取的官方
mysql镜像: -
容器内默认监听的是 3306 端口。
-
如果你想让容器内 MySQL 改监听其他端口(比如 4406):
👉 你必须 修改容器内的 MySQL 配置文件。 -
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:https://hub.docker.com/
| 概念 | 对应类比 | 说明 |
|---|---|---|
| 镜像 | 文件/模板 | 类似于软件安装包或操作系统镜像,是静态的。不能直接运行,只是容器的“蓝图”。 |
| 容器 | 进程/实例 | 是基于镜像运行起来的“程序”,是动态运行的实例,拥有自己的文件系统、进程空间。 |
2.2 命令解读

- docker run: 根据镜像创建容器并运行
- --name mysql: 给容器取一个名字,叫mysql,必须唯一
- -p 3307:3306: 服务器端口3307映射mysql容器的端口3306
- -e KEY=VALUE: 设置环境变量
- mysql: 运行镜像的名字(本地有就直接运行,没有就去Docker Hub搜索下载)
镜像命名规范:[repository]:[tag]
- 其中repository就是镜像名
- tag就是镜像的版本
- 在没有指定tag时,默认就是latest,代表最新版本的镜像。
去DockerHub查看当前的mysql版本:
目前最新的是mysql:8.0.42-debian,所以上面下载的也是这个版本。


3. 常见命令
- docker rmi: 删除镜像
- docker rm: 删除镜像创建的容器
- docker stop: 杀死镜像创建的容器的进程(比如mysql,但是容器并没有关闭)

案例:查看DockerHub,拉取Nginx镜像,创建并运行Nginx容器。
- 在DockerHub中搜索Nginx镜像,查看镜像的名称
- 拉取Nginx镜像
- 查看本地镜像列表
- 创建并运行Nginx容器
- 查看容器
- 停止容器
- 再次启动容器
- 进入Nginx容器
- 删除容器
1. 在DockerHub中搜索Nginx镜像,查看镜像的名称,拉取Nginx镜像
- docker pull nginx


2. 查看本地镜像列表
- docker images

3. 将nginx的镜像打成nginx.tar压缩包
- docker save -o nginx.tar nginx:latest

4. 删除nginx的镜像
- docker rmi nginx:latest

5. 读取nginx.tar包,变成镜像image
- docker load -i nginx.tar

6. 创建并运行容器
- docker run -d --name nginx -p 80:80 nginx
-d表示后台运行,--name nginx表示该容器的名字叫nginx,-p 80:80表示服务器的80端口映射到创建的该容器的80端口,nginx表示根据nginx镜像创建容器,版本号默认最新。

7. 停止容器
注意:停止容器,该容器还存在,并没有删去
- docker stop nginx
8. 显示容器
- docker ps显示运行中的容器
- docker ps -a显示所有容器(包括停止的容器)
9. 启动容器
- docker start启动容器
10. 查看日志
- docker logs nginx
11. 进入容器
- docker exec -it nginx bash

容器内部有独立的操作系统:
12. 退出容器
- exit
4. 默认数据卷挂载
需求:
- 创建Nginx容器,修改nginx容器内的html目录下的index.html文件,查看变化
- 将静态资源部署到nginx的html目录
解决办法:
- 要想知道创建的nginx容器里,静态资源在哪个文件目录开,需要区DockerHub官网查看


4.1 数据卷常用命令
- docker volume create: 创建数据卷
- docker volume ls: 查看所有数据卷
- docker volume rm: 删除指定数据卷
- docker volume inspect: 查看某个数据卷详情
- docker volume prune: 清除数据卷
4.2 数据卷挂载
- 在执行docker run命令时,使用-v 数据卷:容器内目录可以完成数据卷挂载
- 注意:必须在容器创建之前执行!如果容器已经创建了,先删除容器
- 当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷。
1. 删除原有nginx容器
- docker rm -f nginx
2. 创建nginx容器,同时创建挂载html数据卷到nginx容器
- docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
3. 查看所有数据卷
- docker volume ls
4. 详细查看html数据卷
- docker volume inspect html

5. 本地目录挂载
5.1 判断容器有没有挂载
- docker inspect nginx

5.2 本地目录数据卷挂载
- 在执行docker run命令时,使用-v 本地目录:容器内目录可以完成本地目录挂载
- 本地目录必须以"/"或"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
- -v mysql : /var/lib/mysql会被识别为一个数据卷叫mysql
- -v ./mysql: /var/lib/mysql会被识别为当前目录下的mysql目录
- mysql容器里面,配置文件、初始化脚本文件的目录在哪,必须要查看官方镜像文档。
mysql容器的配置文件目录:/etc/mysql/conf.d
mysql容器的初始化脚本目录:/docker-entrypoint-initdb.d
mysql容器的数据目录: /var/lib/mysql
案例:
(1)当前在 Linux 主机上是以 root 用户挂载了本地路径,但容器里运行的是 mysql 用户,因此需要修改文件权限:
# 给配置目录权限
chmod -R 644 /root/mysql/conf/*.cnf
# 给初始化 SQL 脚本权限
chmod -R 644 /root/mysql/init/*.sql
# 推荐:让整个文件夹都对 mysql 用户可读
chmod -R o+r /root/mysql/
(2)创建mysql容器,同时挂载数据卷
docker run -d \
--name mysql \
-p 3307: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
(3)挂载时主要要点:
- 如果宿主机目录为空,容器首次启动时,会将容器内默认的数据内容拷贝到宿主机目录中;
- 如果宿主机目录为空,Docker 会把宿主机目录“覆盖”容器对应路径,不会再拷贝容器内部默认数据;容器启动时不会自动把自己默认数据写入宿主机,反而会报错,尤其是像 MySQL 这类期待初始化数据的服务。

6. Dockerfile语法
镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
传统部署一个Java应用的步骤:
- 准备一个Linux服务器
- 安装JRE并配置环境变量
- 拷贝jar包
- 运行jar包
注意:不同操作系统,对应的系统调用不同
| 功能 | Linux 调用 | Windows 调用 |
|---|---|---|
| 打开文件 | open() (glibc 调用 sys_open) | CreateFile() (kernel32.dll) |
| 创建线程 | pthread_create() | CreateThread() |
| 网络通信 | socket() + bind() | WSASocket() + bind() |
| 动态库加载 | dlopen() | LoadLibrary() |
相同功能,在 Linux 和 Windows 系统中要用不同的函数。
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 |

7. 自定义镜像

自定义镜像案例:

其中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
# 入口
构建自定义镜像docker-demo

检查镜像docker-demo是否构建成功
为该镜像创建一个容器并运行
docker run -d --name dd -p 8090:8080 docker-demo
访问试一试:
http://192.168.31.20:8090/hello/count

8. 容器网路互连

- docker network create 创建一个网络
- docker network ls 查看所有网络
- docker network rm 删除指定网络
- docker network prune 清除未使用的网络
- docker network connect 使指定容器连接加入某网络
- docker network disconnect 使指定容器连接离开某网络
- docker network inspect 查看网络详细信息
创建一个名字叫gtc的网络:
docker network create gtc

将容器加入到gtc网络
docker network connect gtc mysql
9. 项目部署
9.1 后端部署
(1)将后端项目打成jar包

(2)将jar包和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 hm-service.jar /app.jar
# 入口
(3)构建后端项目的镜像
docker build -t hmall .

(4)通过hmall镜像,启动容器
docker run -d --name hmall -p 8090:8080 --network gtc hmall
docker run -d \
--name hmall \
-p 8090:8080 \
--network gtc \
hmall

9.2 前端部署
需求:创建一个新的nginx容器,将nginx.conf和html目录与容器挂载
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network gtc \
nginx
访问:192.168.31.20:18080

注意: 如果报错403,需要给/root/nginx/html加755的权限(chmod -R 755 /root/nginx/html)

10. DockerCompose
Docker Compose通过一个单独的docker-compose.yml模版文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

10.1 传统部署方式
(1)部署MySQL
docker run -d \
--name mysql \
-p 3307: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
(2)部署后端
docker run -d \
--name hmall \
-p 8090:8080 \
--network gtc \
hmall
(3)部署前端
docker run -d \
--name nginx \
-p 18080:18080 \
-p 18081:18081 \
-v /root/nginx/html:/usr/share/nginx/html \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf \
--network gtc \
nginx
10.2 docker-compose.yml
version: "3.8"
services:
mysql:
image: mysql
container_name: mysql
ports:
- "3307: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:
- "8090: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
10.3 docker compose的命令格式


3万+

被折叠的 条评论
为什么被折叠?



