一、快速入门
1、基础知识
VMware是业界最好用的虚拟机软件之一。Centos7是比较常用的一个Linux发行版本。
先在VMware中创建一个虚拟机,再在虚拟机上安装Centos7系统。
FinalShell 是一款功能强大的国产SSH客户端,SSH/Telnet连接:支持远程登录Linux/Windows服务器。即登录软件去操作linux系统。
启动虚拟机并登录之后可以输入 ip addr 来查看ip地址:ens33网卡往下找。
输入了之后没有ip地址,就输入 ./start-ens33.sh(输入 ll可以查看)
2、命令
#查看版本
docker - v
# 启动Docker
systemctl start docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 执行docker ps命令,如果不报错,说明安装启动成功
docker ps
3、快速入门
**镜像和容器:**当我们利用docker安装应用时,Docker会自动搜索并下载应用镜像。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离的环境,称为容器(可以想象成一个小型的linux)。
镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub

docker安装mysql:
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
mysql
#实际就一行\是换行
- docker run 创建并运行一个容器, -d 让容器在后台运行(可以做其他的事情了,如果不加,什么都不能做,命令行会停在那里)
- 给容器起一个名字,必须唯一
- -p 3306:3306 设置端口映射 前面是宿主机端口 后面是容器内端口 。 将宿主机(host)的3306端口与容器(container)内部的3306端口建立映射关系,使得外部请求发送到宿主机指定端口时,Docker引擎会自动将这些请求转发到对应容器的目标端口,从而穿透容器默认的网络隔离机制,实现外部对容器内服务的访问。 如果有两个mysql,mysql的端口都是3306是不变的,所以应该改变宿主机的端口。
- -e .... key = value的形式,设置环境变量
- mysql 是指运行镜像的名字 完整写法 镜像名:镜像版本
二、Docker基础
1、常见命令

命令 | 说明 | 文档地址 |
---|---|---|
docker pull | 拉取镜像 (仓库到本地) | docker pull |
docker push | 推送镜像到DockerRegistry | docker push |
docker images | 查看本地镜像 配置了别名为dis | docker images |
docker rmi | 删除本地镜像 | docker rmi |
docker save | 保存镜像到本地压缩文件(虚拟机上) | docker save |
docker load -i tar包名 | 加载本地压缩文件到镜像 -i tar包名 | docker load |
docker run | 创建并运行容器(不能重复创建) | docker run |
docker stop | 停止指定容器 | docker stop |
docker start | 启动指定容器 | docker start |
docker restart | 重新启动容器 | docker restart |
docker rm (-f) 容器名 | 删除指定容器(要先停止) -f 强制删除,不用停止 | docs.docker.com |
docker ps (-a) | 查看运行中容器 -a 查看所有容器 dps查看简化的 | docker ps |
docker logs (-f)容器名 | 查看容器运行日志 -f 持续输出日志 ctrl+c 停止 | docker logs |
docker exec -it 容器名 bash | 进入容器 -it (添加一个可输入终端,可以交互了)容器名 bash(表示命令行交互类型) 输入exit 退出 | docker exec |
docker inspect | 查看容器详细信息 容器名 | docker inspect |
不会写后面的内容就 --help
docker exec -it mysql mysql -uroot -p 直接进入mysql 的命令,省去了进入控制台了 否则需要 docker exec -it mysql bash进入容器,并且进入命令行交互之后输入mysql -uroot -p123
命令别名:
-
vi ~/.bashrc 找到root目录下的bashrc文件 进入之后点击i/a/o进入插入模式即可插入
-
alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"' alias dis='docker images'添加两个命令别名
-
退出,按esc退出插入模式,按:进入底行模式,输入wq退出并保存
-
输入source ~/.bashrc 让其生效
扩展:文本编辑命令
vim fileName文件存在就打开,文件不存在创建一个新的

|---------------|------------------------|
| 底行模式指令 | 含义 |
| :wq | 保存并退出 |
| :q! | 不保存退出 |
| :set nu | 显示行号 |
| :set nonu | 取消行号显示 |
| :n | 定位到第n行,如 :10 就是定位到第10行 |
|---------------|----------------------|
| 命令模式指令 | 含义 |
| gg | 定位到文本内容的第一行 |
| G | 定位到文本内容的最后一行 |
| dd | 删除光标所在行的数据 |
| ndd | 删除当前光标所在行及之后的n行数据 |
| u | 撤销操作 |
| i 或 a 或 o | 进入插入模式(进入后光标所处的位置不同而 |
具体看Javaweb 讲义Docs
2、数据卷 (volume)
数据卷:是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。

通过: docker volume --help 可以查看所有命令信息
命令 | 说明 | 文档地址 |
---|---|---|
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 |
卷创建宿主机目录自动创建,所以创建卷之后就该挂载容器目录。
在执行docker run 命令时,使用 -v 数据卷:容器内目录可以完成数据卷挂载。挂载只能在创建容器时挂载。
当创建容器时,如果挂载了数据卷且数据卷不存在,会自动创建数据卷。
所以要执行的操作就是删除旧的nginx容器,创建新的容器并挂载即可。
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
在执行docker run命令时, 使用-v 本地目录:容器内目录 可以完成本地目录挂载
注:本地目录必须以"/"或者"./"开头,如果直接以名称开头,会被识别为数据卷而非本地目录
3、自定义镜像
镜像就是包含了应用程序、程序运行的系统函数库,运行配置文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。
镜像结构
镜像文件不是随意堆放的,而是按照操作的步骤分层叠加而成,每一层形成的文件都会单独打包并标记一个唯一id,称为Layer (层)。这样,如果我们构建时用到的某些层其他人已经制作过,就可以直接拷贝使用这些层,而不用重复制作。
例如,第一步中需要的Linux运行环境,通用性就很强,所以Docker官方就制作了这样的只包含Linux运行环境的镜像。我们在制作java镜像时,就无需重复制作,直接使用Docker官方提供的CentOS或Ubuntu镜像作为基础镜像。然后再搭建其它层即可,这样逐层搭建,最终整个Java项目的镜像结构如图所示:

dockerfile
就是一个文本文件,其中包含一个个的指令(Instruction),用指令说明要执行什么操作来构建镜像。将来Docker可以根据Dockerfile帮助我们构建镜像。常见指令有:
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:6 |
ENV | 设置环境变量,可在后面指令使用 | ENV key value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./xx.jar /tmp/app.jar |
RUN | 执行Linux的shell命令,一般是安装过程的命令 | RUN yum install gcc |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
当Dockerfile文件写好以后,就可以利用命令来构建镜像了。
docker build -t myImage:1.0 .
-t:是给镜像起名,格式依然是repository:tag(名字:版本)格式,不指定tag时,默认为latest
.:是指定Dockerfile所在目录,如果就在当前目录,则指定为"."
4、网络
自己存在一个网络,但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。
加入自定义网络的容器才可以通过容器名相互访问,Docker的网络操作命令如下:
命令 | 说明 | 文档地址 |
---|---|---|
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 |
# 1.通过命令创建一个网络
docker network create hmall
# 2.连接到网络 这样会有两个网络
docker network connect hmall dd
#3.在创建容器时添加 --network hmall 会将默认的网络替代
docker run -d --name dd -p 8080:8080 --network hmall docker-demo
三、项目部署
DockerCompose
通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联Docker容器的快速部署。
首先应编写docker-compose.yml文件:
javascript
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"
networks:
- new
networks:
new:
name: hmall
对应的docker run 的命令:
javascript
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v ./mysql/data:/var/lib/mysql \
-v ./mysql/conf:/etc/mysql/conf.d \
-v ./mysql/init:/docker-entrypoint-initdb.d \
--network hmall
mysql
编写好docker-compose.yml文件,就可以部署项目了。常见的命令:
基本语法如下:
docker compose [OPTIONS] [COMMAND]
其中,OPTIONS和COMMAND都是可选参数,比较常见的有:
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 |
Options | -p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 |
Commands | up | 创建并启动所有service容器 |
Commands | down | 停止并移除所有容器、网络 |
Commands | ps | 列出所有启动的容器 |
Commands | logs | 查看指定容器的日志 |
Commands | stop | 停止容器 |
Commands | start | 启动容器 |
Commands | restart | 重启容器 |
Commands | top | 查看运行的进程 |
Commands | exec | 在指定的运行中容器中执行命令 |