Docker

Docker概述

用于构建和发布应用的容器技术

  • Docker将程序和运行环境直接打包在一起,可保证一致运行环境,更轻松的迁移。
  • 对进程进行隔离封装,容器与容器之间互不影响,更高效的利用系统资源。
  • 通过镜像复制N多个环境一致的容器,方便部署。

Linux下安装

1
2
3
4
5
6
7
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

# 查看状态
service docker status
# 启动
sudo service docker start

相关概念

镜像 image

一个镜像代表一个软件

容器 container

基于某个镜像运行一次就是生成一个容器

仓库 repository

用来存储docker中的所有镜像的具体位置。

远程仓库:docker在世界范围维护一个唯一的远程仓库

本地仓库:当前自己机器中下载镜像的存储位置

hello-world

1
docker run hello-world

1、docker run 镜像名 根据run后面的镜像运行一个容器

2、在运行之前先在自己本地仓库查找对应的镜像直接使用,找不到再去远程仓库下载使用。

Docker相关命令

docker引擎以及帮助相关

1
2
3
4
5
docker info

docker version

docker --help

images相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 查看本地仓库的所有镜像
docker images
# 查看本地仓库的所有镜像id
docker images -q
# 下载镜像
docker pull 镜像名:版本号
# 搜索镜像版本
docker search 镜像名
# 删除镜像(简写docker rmi) -f强制删除
docker image rm -f 镜像名:版本号或容器名称
# 清空本地仓库
docker rmi -f $(docker images -q)
# 载入镜像
docker load -i 文件名
# 导出镜像压缩包
docker save -o 文件名.tar 镜像名:版本号

container相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 运行容器
docker run 镜像名:版本号
docker run 镜像id
# 查看运行的容器
docker ps
# 查看所有的容器
docker ps -a
# 查看所有的容器id
docker ps -q
#启动 关闭 重启 容器
docker start 容器名或者容器id
docker stop 容器名或者容器id
docker restart 容器名或者容器id
# 立即停止
docker kill 容器名或者容器id
# 删除容器
docker rm -f 容器名或者容器id
# 容器日志
docker logs -f 容器名或者容器id
# 容器内进程
docker top 容器名或者容器id
# 容器内部交互
docker exec -it 容器名或者容器id bash

常见软件的启动

1
2
3
4
5
# mysql
docker run -p 3306:3306 --name mysql -v /mydata/mysql/log:/var/log/mysql -v /mydata/mysql/data:/var/lib/mysql -v /mydata/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

# redis
docker run -p 6379:6379 --name redis -v /mydata/redis/data:/data -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:7.0 redis-server /etc/redis/redis.conf

Docker中的网络

Docker允许通过外部访问容器或容器互联的方式来提供网络服务。

一般在使用docker网桥实现容器与容器之间通信时,都是站在一个应用的角度进行容器通信。

1
2
3
4
5
6
7
8
# 查看docker网桥配置
docker network ls
# 创建自定义网桥
docker create 网桥名称
# 指定网桥启动
docker run --network 网桥名称 --name 容器名称 镜像名:版本
# 删除网桥
docker network rm 网桥名

Dockerfile

用于构建自定义镜像

编写Dockfile文件:

1
2
3
4
5
6
FROM openjdk:8-jdk 
WORKDIR /app
ADD redis_springboot-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8081
ENTRYPOINT ["java","-jar"]
CMD ["app.jar"]
  • FROM 基于哪个镜像进行构建
  • WORKDIR 定义静进入容器时的默认位置,接下来后续操作的工作空间
  • ADD 将上下文中的jar文件复制到工作空间,压缩文件会自动解压,COPY则不会
  • EXPOSE 暴露端口
  • RUN 创建新的镜像层,用于安装软件包
  • ENTRYPOINT 添加启动应用的固定命令,可接受docker run命令的参数
  • CMD 执行jar

项目打包

1
2
# 跳过test进行打包
mvn clean package -Dmaven.test.skip=true

将Dockerfile文件与项目的.jar文件放在同一目录下

执行构建命令:

1
docker build -t 镜像名:版本 .