一、简介
Docker:主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。
二、说明
相对于虚拟机
虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。
-
启动速度:
- 虚拟机需要先启动虚拟机的操作系统,再启动应用
- Docker相当于启动宿主操作系统上的一个进程
-
资源占用:
- 虚拟机是一个完整的操作系统,需要占用大量的磁盘、内存和CPU资源,一台机器只能开启几十个的虚拟机
- Docker是一个进程,只需要将应用以及相关的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker
优势
-
更容易迁移:提供一致性的运行环境
-
更容易维护:使用分层技术和镜像
-
更容易扩展:可以使用基础镜像进一步扩展得到新的镜像
使用场景
-
持续集成
-
提供可伸缩的云服务
-
搭建微服务架构
镜像与容器
-
镜像:是一种静态的结构,可以看成面向对象里面的类
- 镜像包含着容器运行时所需要的代码以及其它组件,它是一种分层结构,构建镜像时,会一层一层构建,前一层是后一层的基础,每一层都是只读的(read-only layers)。
-
容器:是镜像的一个实例
- 构建容器时,可通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。
三、使用
Windos10本地搭建
-
1、下载Docker Desktop
-
2、开启 Hyper-V
-
3、配置镜像加速
-
4、使用Linux虚拟机模式
-
5、开放2375端口
-
6、使用Git Bash搭建服务
命令
服务命令
- 一键安装命令
curl -sSL https://get.daocloud.io/docker | sh
- 启动服务命令
systemctl start docker
- 查看系统信息
docker system info
- 设置开机启动
systemctl enable docker
systemctl is-enabled docker
容器命令
- 运行容器
docker run learn/tutorial echo "hello world"
docker run -it ubuntu:15.10 /bin/bash(交互式运行:-t: 在新容器内指定一个伪终端或终端 -i: 允许你对容器内的标准输入进行交互)
docker run -d -p 5000:5000 training/webapp python app.py(-d: 让容器在后台运行 -p: 指定端口映射 -P: 随机端口 --name: 指定名称)
- 在容器中安装新的程序
docker run learn/tutorial apt-get install -y ping
- 获取容器列表
docker ps -a(-a: 所有容器 -l 最后一次创建的容器)
- 保存对容器的修改
docker commit c7ca learn/ping
- 检查运行中的容器底层信息
docker inspect fds
- 查看容器日志
docker logs learn/ping(-f: 容器内部的标准输出)
- 启动/停止/重启容器
docker start/stop/restart learn/ping
- 进入容器
docker exec -it 243c32535da7 /bin/bash
- 导出容器
docker export 1e560fca3906 > ubuntu.tar
- 导入容器快照
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
- 删除容器
docker rm -f 1e560fca3906
- 查看容器端口
docker port 1e560fca3906
- 查看内部的运行进程
docker top 1e560fca3906
网络命令
- 新建网络
docker network create -d bridge test-net
- 容器设置网络
docker run -itd --name test1 --network test-net ubuntu /bin/bash
- 查看网络
docker network ls
- 设置host网络
docker run -itd --name test1 --network host redis
镜像命令
- 查看镜像
docker images
- 搜索镜像
docker search tutorial
- 下载/发布/删除镜像
docker pull/push/rmi learn/ping
- 运行新的镜像
docker run learn/ping ping www.baidu.com
- 设置镜像标签
docker tag 860c279d2fec runoob/centos:dev
- 构建镜像
docker build -t runoob/centos:6.7 .(.: 可指定绝对路径)
Dockerfile
FROM java:alpine
VOLUME /tmp
ADD app-server-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
- FROM:指定镜像
- RUN:运行命令(build期间)
- COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径
- CMD:运行指令(run期间)
- ENTRYPOINT:配合CMD在run期间使用
- ENV:设置环境变量
- ARG:设置环境变量(作用域在文件内)
- VOLUME:数据挂载点
- EXPOSE:声明端口
- WORKDIR:指定工作目录
- USER:指定用户和用户组
Compose
version: '3'
services:
mysql:
image: mysql:5.7
container_name: sc-mysql
restart: always
network_mode: host
ports:
- 3306:3306
volumes:
- ../data/mysql:/var/lib/mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root123
version:指定compose版本
services:
service:
image: 指定容器运行的镜像
build:
- context:指定构建镜像的上下文路径
- dockerfile:指定构建镜像的 Dockerfile 文件名
- args:添加构建参数
- labels:设置构建镜像的标签
command:覆盖容器启动的默认命令
depends_on:设置依赖关系
entrypoint:覆盖容器默认的 entrypoint
env_file:从文件添加环境变量
environment:添加环境变量
expose:暴露端口
extra_hosts:添加主机名映射
logging:服务的日志记录配置
network_mode:设置网络模式
restart:设置重启策略
volumes:主机的文件挂载到容器
JAVA
1、配置dockerfile
FROM java:alpine
VOLUME /tmp
ADD test-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
2、配置docker镜像build插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.2.0</version>
<configuration>
<!-- 注意imageName一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 -->
<imageName>test/${project.artifactId}</imageName>
<dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
<rm>true</rm>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
3、构建镜像
mvn package && mvn docker:build
4、配置docker-compose
version: '3'
services:
test:
image: test/test:latest
container_name: test
restart: always
network_mode: host
ports:
- 8888:8888
environment:
TZ: Asia/Shanghai
JVM_OPTS: -Xmx256m -Xms256m -Xmn128m -XX:MaxPermSize=256m
5、启动容器
docker-compose up -d test