Docker简介

        Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中。 Docker有3大核心:镜像、容器、仓库。 为什么要用Docker? 快速交付和部署 轻松的迁移和扩展 高效的虚拟化 简单的管理

容器 docker固化 docker容器化部署_容器 docker固化

容器 docker固化 docker容器化部署_docker_02

 

安装和运行环境

Windows:推荐desktop,系统要求Windows 10,Windows Server 2016,Windows Server 2019 Linux:推荐engine,https://docs.docker.com/engine

支持的版本见图:

容器 docker固化 docker容器化部署_容器_03

        Docker从17.03版本之后分为CE(Community Edition: 社区版)和EE(Enterprise Edition: 企业版)。相对于社区版本,企业版本强调安全性,但需付费使用。我们使用社区版本即可。 Windows安装:下载exe安装包,直接下一步到底。点图标启动,可以设置开机启动启动。 Linux安装:Docker支持64位版本的CentOS 7和CentOS 8及更高版本,它要求Linux内核版本不低于3.10。查看Linux版本的命令:lsb_release -a或cat /etc/redhat-release。查看内核版本有三种方式:cat /proc/version、uname -a、uname -r。 一键安装: 官方:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 国内 daocloud命令:curl -sSL https://get.daocloud.io/docker | sh

        离线安装:去https://download.docker.com/linux/centos/ 找到使用的CentOS版本,然后浏览到x86_64/stable/Packages/并下载要安装的Docker版本的.rpm文件。

        安装:sudo yum install 安装路径/安装包名称.rpm

        启动:sudo systemctl start docker

        停止:sudo systemctl stop docker

        开机自启:  sudo systemctl enable docker.service

                            sudo systemctl enable containerd.service

        禁用自启:  sudo systemctl disable docker.service

                            sudo systemctl disable containerd.service

        常见的安装失败的原因:Windows下没有启用Hyper-v,或者BIOS中没有开启CPU虚拟化。缺少WSL,WSL是Windows下的一个linux虚拟环境,安装WSL2即可。linux下包冲突的问题,移除冲突的包。

 

基本操作

        查看本地所有镜像:docker images

        查看所有状态容器:docker ps -a

        查看docker版本:docker version、docker -v  

        查看docker信息:docker info

        查看帮助:docker --help

        拉取镜像:docker pull 镜像名:tag

docker run

        -d 后台运行容器,并返回容器ID

        -v 宿主机目录:容器中的目录: 挂载目录,将容器中的目录映射到宿主机中

        -p 指定端口映射,格式为:主机(宿主)端口:容器端口

        -e username="ritchie": 设置环境变量

        --name nginx1.18: 为容器指定一个名称

        --restart=always 跟随docker自动启动

        --link mysql:mysql: 添加链接到另一个容器

        -i 保持容器运行,通常与-t同时使用,加入it两个参数后,容器创建后自动进入容 器中,退出容器后,容器自动关闭

        -t 为容器重新分配一个伪输入终端

下图是docker寻找镜像的逻辑

容器 docker固化 docker容器化部署_容器 docker固化_04

举个列子,使用官方镜像安装tomcat,并将conf、webapps、logs目录映射至宿主机上

1、拉取tomcat官方镜像的指定版本

docker pull tomcat:9.0.73-jdk8

2、运行tomcat镜像

docker run --name=wm-tomcat -itd -p 8081:8080 --restart=always
        -v D:/docker-tomcat/conf:/usr/local/tomcat/conf
        -v D:/docker-tomcat/webapps:/usr/local/tomcat/webapps
        -v D:/docker-tomcat/logs:/usr/local/tomcat/logs tomcat:9.0.73-jdk8

 

打包镜像

        打包镜像有两种方式,一种是通过编写dockerfile文件进行build,另一种是使用commit命令保存当前容器状态生成镜像,个人推荐使用前者。

通过编写Dockerfile文件

 docker build命令:

        --build-arg=[] :设置镜像创建时的变量

        -f :指定要使用的Dockerfile路径

        --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式

        例:(dockerfile目录下执行命令)

        docker build -t my-centos:web ./ docker build --build-arg JAR_FILE=app.jar -t test ./

dockerfile常用参数:

        FROM                      #基础镜像,一切从这里开始构建

        MAINTAINER            #镜像是谁写的,姓名+邮箱

        RUN                        #镜像构建时需要运行的命令

        ADD                        #步骤,tomcat镜像,这个tomcat压缩包;添加内容,解压

        WORKDIR                #镜像工作目录

        VOLUME                  #挂载的目录

        EXPOSE                   #暴露端口配置

        CMD                       #指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代

        ENTRYPOINT           #指定这个容器启动的时候要运行的命令,可以追加命令

        ONBUILD                 #当构建一个被继承DockerFile 这个时候就会运行 ONBUILD 的指令,触发指令

        COPY                      #类似ADD,将我们的文件拷贝至镜像中,不解压

        ENV                        #构建的时候设置环境变量

举个例子:

FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} /usr/local/app.jar
COPY settings.properties /usr/local/settings.properties
EXPOSE 8888
ENTRYPOINT ["java","-jar","/usr/local/app.jar"]

打包时传入jar名称

docker build --build-arg JAR_FILE=app.jar -t test ./

通过docker commit

        当我们觉得某个运行中的容器特别好用,就想把它保留起来,这时候我们可以通过docker build指令将这个运行中的容器构建成一个镜像,然后在其他电脑上也可以使用了; 还有就是针对容器进行改造,通过把一个运行中的容器通过增删改文件或者安装卸载一个程序改造成自己心仪的容器,然后通过命令行生成对应的镜像文件;

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

        OPTIONS说明:

                -a :提交的镜像作者;

                 -c :使用Dockerfile指令来创建镜像;

                -m :提交时的说明文字;

                -p :在commit时,将容器暂停。

举个例子:

docker commit -a "test" -m "my-mysql" a404c6c174a2 mysql:5.7.41-debian

镜像上传至docker hub(要先tag,再push)

进入镜像所在目录

docker login
docker tag test ccron/test
docker push ccron/test

私有仓库

        私服registryd搭建

docker pull registry
                docker run --name=my-registry -d -p 5000:5000 --restart=always
                -v D:/docker-registry/tmp:/tmp/registry
                -v D:/docker-registry/:/var/lib/registry
                --privileged=true registry

        docker engine 增加配置  

"insecure-registries": [     "192.168.1.112:5000"   ]

桌面版的配置见下图

容器 docker固化 docker容器化部署_容器 docker固化_05

linux的engine版

修改配置文件etc/docker/daemon.json,没有就创建一个。

{ "registry-mirrors":
        ["https://xxxxxxx.mirror.aliyuncs.com", "http://192.168.1.112:5000"],  
"insecure-registries":
        ["http://192.168.1.112:5000"]
}

向私服push镜像

docker tag test 192.168.1.112:5000/test
        docker push 192.168.1.112:5000/test

从私服拉取镜像

docker pull 192.168.1.112:5000/test

离线操作

        导出本地镜像

                docker save -o D:\tomcat1.tar my:tomcat1

        导入本地镜像

                docker load -i D:\tomcat1.tar

        本地镜像列表

                docker images

        容器自动启动 docker update --restart=always 【容器名】