Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上。
作用:快速发布打包迁移使用。
概念:
DOCKER_HOST(宿主机) | 安装了 docker 的计算机 |
Image(镜像) | image 是一个模板,定义了 Linux 的文件系统和希望在虚拟环境中运行的程序 |
Container(容器) | container 是根据 image 模板构建出来的 Linux 虚拟环境(镜像的运行为容器) |
Registry(注册服务/仓库) | registry 是集中存储 image 的地方,镜像运行后变成容器,容器可以让用户使用 |
官方公开的registry:docker hub
已经存储了非常多常用的image(https://hub.docker.com),但是国内经常连不上,常见的加速器有:
https://help.aliyun.com/document_detail/60750.html?spm=a2c4g.11186623.6.549.78a84685hCkoUP(常用阿里云的) |
企业内会搭建自己的私有registry来使用 |
启动decker
systemctl start docker
首先禁止防火墙开机启动
systemctl disable firewalld
设置docker开机自动启动
systemctl enable docker
暂时关闭SELinux
setenforce 0
配置自己的私有registry
1.vi /etc/hosts
添加私有registry的地址
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.2.209 docker-registry #添加的内容
2.vi /etc/docker/daemon.json
添加私有 registry
{
"registry-mirrors":["https://6kx4zyno.mirror.aliyuncs.com"],
"insecure-registries":["docker-registry:5000"] #添加的
}
3.刷新配置文件
systemctl daemon-reload
4.重启 docker
systemctl restart docker
5.检查是否配置成功
docker info
- 私有 registry 中的镜像列表(我自己搭建的没用)
http://192.168.2.209:5000/v2/_catalog
容器命令:
运行镜像创建并启动容器,如果镜像在本地不存在,会自动去 registry 中下载
docker run [option] image [args]
常见的 option:
–name | 为启动后的容器起一个名字 |
-p | 配置宿主机和容器的端口映射,格式(宿主机:容器)。宿主机端口接受的数据,转发给容器端口 |
-v | 配置宿主机和容器的目录映射,格式(宿主机:容器)。容器保存在目录的数据会保存在宿主机目录中,容器读取目录中的数据也会从宿主机目录读取, 如果不配置目录映射,容器关闭后会清空产生的所有数据。 |
-it | 以交互模式启动容器,通常搭配 /bin/bash 参数使用 (进入容器内部)。 容器启动后自动进入容器内部系统,在输入的命令就是在容器内系统执行的命令,使用 exit 退出容器,回到宿主机,容器会自动关闭。 |
-d | 以后台运行模式启动容器 |
示例 1:
docker run \ #运行容器,可以当作创建容器的命令,每这样一次,就会自动创建一个容器
--name mynginx \ #容器名字
-p 8070:80 \ #用户访问宿主机8070端口,宿主机把8070收到的数据转发给80端口
#操纵某(宿主机的/root/docker/nainx/log或者容器的/var/log/nginx)一个目录都会发生变化
-v /root/docker/nainx/log:/var/log/nginx \
-it \
docder-registry:5000/nginx \
/bin/bash #docker后台必须运行一个进程,否则容器就会退出,在这里表示启动容器后启动bash
用例1:
docker run --name mynginx -p 8070:80 -v /root/docker/nginx/log:/var/log/nginx -it docker-registry:5000/nginx /bin/bash
解释:
以交互模式运行 docker-registry:5000/nginx 镜像,启动容器后打开 /bin/bash 程序
容器名字叫做:mynginx
容器的 80 端口绑定在宿主机的 8070 端口
容器的 /var/log/nginx 目录绑定在宿主机的 /root/docker/nginx/log 目录
在容器内使用 nginx 命令启动 nginx
在浏览器使用 DOCKER_HOST_IP:8070 访问 nginx
用例2:
docker run -d -p 8070:80 -v /root/docker/nginx/log:/var/log/nginx docker-registry:5000/nginx
解释:
以后台模式运行 docker-registry:5000/nginx 镜像,启动容器后自动运行 nginx
容器名字自动生成
容器的 80 端口绑定在宿主机的 8070 端口
容器的 /var/log/nginx 目录绑定在宿主机的 /root/docker/nginx/log 目录
查看容器列表
在浏览器使用 DOCKER_HOST_IP:8070 访问 nginx
查看容器列表
docker ps #没有选项则查看运行中的容器列表
docker ps -a #全部容器列表(未运行+运行中)
docker ps -a -q #查看所有状态的容器编号(CONTAINER ID)
列表内容:
CONTAINER ID | 容器(id)唯一标识 |
IMAGE | 生成容器的镜像 |
COMMAND | 容器启动后执行的命令 |
CREATED | 容器的创建时间 |
STATUS | 状态,Up(运行中)Exited(未运行) |
PORTS | 端口映射 |
NAMES | 容器名字 |
启停命令docker start/stop/kill/restart CONTAINER 启动/停止/强制停止/重启容器
CONTAINER 可以使用NAMES或者CONTAINER ID
使用CONTAINER ID的时候可以只输入唯一的前n位
比如:
docker start 3148
删除容器:docker rm CONTAINERID/NAME #删除未运行的容器
docker rm 3148
进入容器内部:docker exec -it fCONTAINERID/NAME /bin/bash #进入容器内部(进入后台运行的容器)
docker exec -it fe3a3a74a982 /bin/bash #进入容器内部(进入后台运行的容器)
nginx -s stop #进入容器内部后关闭nginx
exit #从容器内部退出到宿主机,不会对容器产生影响,不会关闭容器
镜像命令:
查看本地镜像列表docker images [option]
常见的选项:
-q只显示镜像ID IMAGE ID,如:docker images -q
REPOSITORY | 镜像名字 = registry + name |
TAG | 标签/版本号 |
IMAGE ID | 镜像的唯一标识 |
CREATED | 镜像创建时间 |
SIZE | 镜像大小 |
搜索镜像(从Docker hub)docker search IMAGE
如docker seach java
网络不好,一般搜索不到
从 registry 下载镜像到本地docker pull IMAGE
比如:下载 docker-registry:5000 仓库中的 alpine-glibc 镜像到本地
docker pull docker-registry:5000/alpine-glibc
从本地上传镜像到 registrydocker push IMAGE
删除未创建容器的镜像docker rmi IMAGE(IMAGE 可以使用 NAMES 或者 IMAGE ID)
注意:删除镜像前要先删除容器
删除镜像比如:
docker rmi 5a9061639d0a
删除所有未创建容器的镜像
docker rmi `docker images -q`
制作镜像最常用的技术是Dockerfile
Dockerfile是一个描述镜像内容和构建步骤的配置文件
使用docker build 命令可以解析Dockerfile文件生成镜像
Dockerfile中的指令:
FROM | 指定基础镜像,在哪个镜像的基础上进行二次开发,必须为第一个指令 |
MAINTAINER/LABEL | 维护者信息(作者信息) |
ARG | 设置变量,由构建的时候传入 |
ENV | 设置环境变量 |
USER | 设置执行命令的用户 |
WORKDIR | 设置执行命令的目录 |
ADD/COPY | 将本地文件添加到镜像内;ADD支持自动解压;COPY不支持自动解压 |
RUN | 设置构建镜像时要的执行命令示例1:RUN [“yum”,"-y",“install”,“mysql”]示例2:RUM yum -y install mysql |
CMD/ENTRYPOINT | 设置容器启动时执行的命令。CMD可以设置多个命令;ENTRYPOINT只有最后一个会生效示例1:CMD [“systemctl”, “enable”, “mysql”]示例2:ENTRYPOINT systemctl start mysql |
EXPOSE | 设置需要映射到宿主机的端口号 |
VOLUME | 设置需要映射到宿主机的目录 |
使用 Dockerfile 制作 jdk 镜像:
基于 alpine-glibc 进行二次开发
alpine 是最小的 Linux 系统镜像(5M),精简掉了绝大部分的功能
alpine-glibc 是基于 alpine 的镜像,支持运行 glibc 程序
- 在 /root 下创建 docker/jdk 目录
mkdir -p /root/docker/jdk
- 进入 /root/docker/jdk 目录
cd /root/docker/jdk
- 上传 jdk 到当前目录
上传这个版本的:jdk-8u221-linux-x64.tar.gz
- 创建 Dockerfile 文件
touch Dockerfile
- 编辑 Dockerfile 文件
#基于alpine-glibc进行二次开发
FROM docker-registry:5000/alpine-glibc
#维护者和联系方式
MAINTAINER ZhangFan 2868508839@ww.com
#使用root用户执行命令
USER root
#在/root目录下执行命令
WORKDIR /root
#拷贝宿主机当前目录下的jdk到镜像内的/root目录
COPY jdk-8u221-linux-x64.tar.gz /root
#解压jdk
RUN tar -xvf jdk-8u221-linux-x64.tar.gz
#剪切jdk到/usr/local/jdk
RUN mv jdk1.8.0_221 /usr/local/jdk
#删除jdk压缩包
RUN rm -f jdk-8u221-linux-x64.tar.gz
#配置JAVA_HOME环境变量
ENV JAVA_HOME=/usr/local/jdk
#配置CLASSPATH环境变量
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#配置PATH环境变量
ENV PATH $PATH:$JAVA_HOME/bin
#在容器启动时输出jdk版本号
CMD java -version
- 使用 docker build -t jdk . 命令构建镜像
-t :指定构建镜像的名字(jdk)
. :使用哪个目录中的 Dockerfile 构建镜像;. 表示当前目录
docker build -t jdk .
- 构建失败需要先删除失败的镜像,再重新构建
- 使用 docker run jdk 命令运行镜像,
检查是否输出 java 版本信息
docker run jdk
制作 spring-cloud-01-eureka-server 镜像:
- 打包 eureka-server 项目
- 在 /root 下创建 docker/spring-cloud-01/eureka-server 目录
- 进入 /root/docker/spring-cloud-01/eureka-server 目录
- 上传 jar 文件
- 创建 Dockerfile 文件
- 编辑 Dockerfile 文件
1. 基于 jdk 镜像进行二次开发
2. 编写维护者信息
3. 设置执行命令用户为 root 用户
4. 设置执行命令目录为 /root 目录
5. 设置容器的 8761 端口需要映射到宿主机
6. 拷贝宿主机当前目录下的 jar 文件到镜像内的 /root 目录
7. 在容器启动后使用 java -jar xx.jar 命令启动 eureka-server 程序
#基于jdk镜像的二次开发
FROM jdk
#维护者和联系方式
MAINTAINER ZhangFan 2868508839@ww.com
#设置执行命令用户为root用户
USER root
#设置执行命令目录为 /root 目录
WORKDIR /root
#设置容器的 8761 端口需要映射到宿主机
EXPOSE 8761
#拷贝宿主机当前目录下的 jar 文件到镜像内的 /root 目录
COPY eureka-server-1.0-SNAPSHOT.jar /root
#在容器启动后使用 java -jar xx.jar 命令启动 eureka-server 程序
CMD java -jar eureka-server-1.0-SNAPSHOT.jar
- 构建 spring-cloud-01-eureka-server 镜像
docker build -t spring-cloud-01-eureka-server .
- 以后台模式运行 spring-cloud-01-eureka-server 镜像,
把容器的 8761 端口映射到宿主机的 8761
docker run -d -p 8761:8761 spring-cloud-01-eureka-server
- 在浏览器使用 http://DOCKER_HOST_IP:8761 访问注册中心