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(常用阿里云的)

https://www.daocloud.io/mirror

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

企业内会搭建自己的私有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
  1. 私有 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 IMAGEdocker 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 程序
  1. 在 /root 下创建 docker/jdk 目录
mkdir -p /root/docker/jdk
  1. 进入 /root/docker/jdk 目录
cd /root/docker/jdk
  1. 上传 jdk 到当前目录
上传这个版本的:jdk-8u221-linux-x64.tar.gz
  1. 创建 Dockerfile 文件
touch Dockerfile
  1. 编辑 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
  1. 使用 docker build -t jdk . 命令构建镜像
    -t :指定构建镜像的名字(jdk)
    . :使用哪个目录中的 Dockerfile 构建镜像;. 表示当前目录
docker build -t jdk .
  1. 构建失败需要先删除失败的镜像,再重新构建
  2. 使用 docker run jdk 命令运行镜像,
    检查是否输出 java 版本信息
docker run jdk

制作 spring-cloud-01-eureka-server 镜像:

  1. 打包 eureka-server 项目
  2. 在 /root 下创建 docker/spring-cloud-01/eureka-server 目录
  3. 进入 /root/docker/spring-cloud-01/eureka-server 目录
  4. 上传 jar 文件
  5. 创建 Dockerfile 文件
  6. 编辑 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
  1. 构建 spring-cloud-01-eureka-server 镜像
docker build -t spring-cloud-01-eureka-server .
  1. 以后台模式运行 spring-cloud-01-eureka-server 镜像,
    把容器的 8761 端口映射到宿主机的 8761
docker run -d -p 8761:8761 spring-cloud-01-eureka-server
  1. 在浏览器使用 http://DOCKER_HOST_IP:8761 访问注册中心

制作docker镜像需要考虑CPU架构吗 docker镜像制作工具_jar