docker——快速构建、运行、管理应用的工具;忽略系统本身的差异而去直接部署
参考来源: 黑马程序员Docker快速入门到项目部署
1.docker安装
#1.安装构建必要的包
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
#2.验证包是官方安装的
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # Docker 的官方 GPG 密钥
#3.设置APT 源地址(stable版本)
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
#4.更新apt源
sudo apt-get update
#5.安装Docker
sudo apt-get install docker-ce docker-ce-cli containerd.io
2.docker程序启动和校验
#1.启动docker
systemctl start docker
#2.停止docker
systemctl stop docker
#3.重启docker
systemctl restart docker
#4.开机自启
systemctl enable docker
以上命令目前没有执行权限,操作的是整个服务器docker这个软件而不是docker的某一个容器
#5.调出本地所有镜像
docker images
#6.调出正在运行的容器
docker ps
3.docker理解
镜像(image):包含应用本身以及运行所需要的环境、配置、系统函数库
容器(container):Docker在运行镜像时创建一个隔离环境
4.常见命令
docker run
创建并运行容器
docker run \
-d\ #代表让容器在后台运行
--name [名称]\
-p [主机端口:虚拟容器端口]\ #端口映射
-e [KEY=VALUE]\ #设置环境变量,每一个镜像不同,hub_docker
[repository]:[tag] #运行镜像名和版本,tag不写默认最新
docker pull
下载镜像
docker pull [repository]:[tag]
docker images
查看本地所有的本地镜像
docker rmi
删除本地镜像
docker rmi [repository]:[tag]
docker build
自定义镜像
docker save
将本地镜像导出
docker save -o [保存文件名tar] [repository]:[tag]
docker load
将导出的镜像文件加载
docker load -i [tar文件]
docker pull
将镜像上传到云端
docker pull [镜像名]
以下命令直接加container名称
docker stop
停止容器进程,但容器本身还在
docker start
启动已经停掉的容器进程
docker ps
查看正在运行的容器(默认是运行容器,加-a是所有容器)
docker rm
删除某一个容器(与rmi区分)
docker logs
查看容器运行日志
docker exec
进入到容器内部
docker exec -it [容器名] bash #exit退出
5.数据卷
数据卷(volume)一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
docker volume create
创建数据卷
docker volume ls
查看所有数据卷
docker volume rm
删除指定数据卷
docker volume inspect
查看某一个数据卷的详情
docker volume prune
清除数据卷
如果容器已经创建了则无法再挂载数据卷,如果挂载时数据卷不存在会自动创建数据卷
挂载命令示例:
docker run -d --name zwh_test -p 80:80 -v [本地绝对路径]:[容器内部路径] [j]
docker inspect [容器名]
查看某一个容器详情(挂载的数据卷)
匿名卷:容器创建时自动创建的数据卷
删除掉容器,数据卷会依旧保留
6.自定义镜像
不依赖于操作系统的运行
层(layer):添加安装包、依赖、配置等,每一次操作都形成新的一层
基础镜像(BaseImage):应用依赖的系统函数库、环境、配置、文件等
入口(Entrypoint):镜像运行入口,一般是程序启动的脚本和参数
Dockerfile其中包含一个个指令,用指令来说明要执行什么操作来构建镜像。将来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 |
https://docs.docker.com/engine/reference/builder
示例 :
FROM ubuntu:16.04
ENV JAVA_DIR=/usr/local
# 设置java环境变量
COPY ./jdk8.tar.gz $JAVA_DIR/
# 复制JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz
&& mv ./jdk1.8.0_144 ./java8
# 设置java环境
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin # 入口,java路径的添加和配置
ENTRYPOINT ["java", "-jar", "/app.jar"] #相当于java -jar /app.jar
为什么要压缩再解压直接拷贝不行吗?
减少复制压力;减少镜像层数
构建镜像:
docker build -t [repository]:[tag] [Dockerfile所在目录]
设置时区为了让日志时间吻合
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
7.Docker网络
默认情况下,所有容器都是以bridge方式连接到Docker的一个虚拟网桥上
ip地址会在停止启动时变动。
加入自定义网络的容器才可以通过容器名互相访问
命令 | 说明 |
---|---|
docker network create [网络名] [容器名] | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect [网络名] [容器名] | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
ip addr | 查看网桥 |
docker run
可以直接加--network
网络名,直接加入网络,可以直接ping 网络名
通。
8.DockerCompose
Docker Compose
通过一个单独的docker-compose.yml模板文件(YAML文件)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署
DockerCompose示例:
version:"3.8"
services:
containerA:
image:A
container_name:A
ports:
- "22:22"
containerB:
image:B
container_name:B
ports:
- "11:11"
每一个容器称为服务
建立container参数:
build:
context:.
dcockerfile:Dockerfile
docker compose
的命令格式如下:
docker compose [options] [command]
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 |
-p | 指定project名称 | |
Commands | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有运行的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |