docker

馋奶兔 提交于 2019-12-10 09:55:33

虚拟化是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以更好的应用这些资源。一般,虚拟化资源包括计算能力和资料存储。

虚拟化技术可以解决高性能的物理硬件产能过剩和老旧硬件产能过低的重组重用,透明化底层物理硬件,最大化利用物理硬件,充分利用资源。

Docker是一个开源项目,诞生于2013年初,基于go语言实现。Docker项目的目标是实现轻量级的操作虚拟化解决方案。Docker的基础是linux容器(LXC)等技术。在LXC的基础上docker做了进一步的封装,让用户不需要关心容器的管理,使得操作更为简便。

Docker的优点,上手快,职责逻辑分类,快速高效的开发周期,鼓励使用面向服务架构。与传统虚拟机相比,docker启动速度快,占用体积小。

Docker是一个客户端服务器架构。Docker客户端只需要向docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作返回结果。Docker提供了一个命令工具docker以及一整套restful api。可以在同一台宿主机上运行docker守护进程和客户端,也可从本地的docker客户端连接到运行在另一个宿主机上的远程docker守护进程。

镜像是构建docker的基石。用户基于镜像来运行自己的容器。镜像是基于联合文件系统的一种层式结构,由一些一步一步构建出来。Docker可以构建和部署容器,把应用程序或者服务打包进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。

Docker用registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运行公共的registry叫做docker hub。用户可以在docker hub注册账号,分享并保存自己的镜像。

  • 二,Docker安装与启动

1,安装

官方建议将docker安装在ubuntu中,因为基于ubuntu发布。如果安装到centos中,建议安装到centos7.x以上的版本中。

步骤

1)Yum包更新到最新

sudo  yum  update

2)安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

sudo  yum  install  -y  yum-utils  device-mapper-persistent-data  lvm2

3)设置yum源为阿里云

sudo  yum-config-manager  --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4)安装docker

sudo  yum  install  docker-ce

5)安装后查看版本

docker  -v

6)设置ustc的镜像

Ustc是老牌的linux镜像服务提供者,ustc的docker镜像加速器速度很快。Ustc  ducker  mirror的优势之一是不需要注册。https://lug.ustc.edu.cn/wiki/mirrors/help/docker

编辑守护文件

vi  /etc/docker/daemon.json

输入如下内容:

{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn", "https://hub.daocloud.io","https://registry.docker-cn.com"],"storage-driver":"devicemapper"}

2,Docker的启动与停止

systemctl命令是系统服务器管理指令

启动docker

systemctl  start  docker

 

启动docker失败

报如下错:

Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.

执行systemctl status docker.service,如下:

● docker.service - Docker Application Container Engine

   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)

   Active: failed (Result: start-limit) since Sun 2019-12-08 13:20:43 EST; 2s ago

     Docs: https://docs.docker.com

  Process: 8345 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock (code=exited, status=1/FAILURE)

 Main PID: 8345 (code=exited, status=1/FAILURE)

Dec 08 13:20:41 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE

Dec 08 13:20:41 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.

Dec 08 13:20:41 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

Dec 08 13:20:41 localhost.localdomain systemd[1]: docker.service failed.

Dec 08 13:20:43 localhost.localdomain systemd[1]: docker.service holdoff time over, scheduling restart.

Dec 08 13:20:43 localhost.localdomain systemd[1]: Stopped Docker Application Container Engine.

Dec 08 13:20:43 localhost.localdomain systemd[1]: start request repeated too quickly for docker.service

Dec 08 13:20:43 localhost.localdomain systemd[1]: Failed to start Docker Application Container Engine.

Dec 08 13:20:43 localhost.localdomain systemd[1]: Unit docker.service entered failed state.

Dec 08 13:20:43 localhost.localdomain systemd[1]: docker.service failed.

并不能准确的提示错误的原因。于是执行dockerd

INFO[2019-12-08T13:25:22.941739986-05:00] Starting up                                 

INFO[2019-12-08T13:25:22.945230659-05:00] parsed scheme: "unix"                         module=grpc

INFO[2019-12-08T13:25:22.945260708-05:00] scheme "unix" not registered, fallback to default scheme  module=grpc

INFO[2019-12-08T13:25:22.945346707-05:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <nil>}  module=grpc

INFO[2019-12-08T13:25:22.945361519-05:00] ClientConn switching balancer to "pick_first"  module=grpc

INFO[2019-12-08T13:25:22.947830668-05:00] parsed scheme: "unix"                         module=grpc

INFO[2019-12-08T13:25:22.947865465-05:00] scheme "unix" not registered, fallback to default scheme  module=grpc

INFO[2019-12-08T13:25:22.947892038-05:00] ccResolverWrapper: sending update to cc: {[{unix:///run/containerd/containerd.sock 0  <nil>}] <nil>}  module=grpc

INFO[2019-12-08T13:25:22.947908923-05:00] ClientConn switching balancer to "pick_first"  module=grpc

WARN[2019-12-08T13:25:22.955206580-05:00] [graphdriver] WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release

WARN[2019-12-08T13:25:22.969194790-05:00] Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man dockerd` to refer to dm.thinpooldev section.  storage-driver=devicemapper

INFO[2019-12-08T13:25:23.202902286-05:00] Creating filesystem xfs on device docker-253:1-697253-base, mkfs args: [-m crc=0,finobt=0 /dev/mapper/docker-253:1-697253-base]  storage-driver=devicemapper

INFO[2019-12-08T13:25:23.207985512-05:00] Error while creating filesystem xfs on device docker-253:1-697253-base: exit status 1  storage-driver=devicemapper

failed to start daemon: error initializing graphdriver: exit status 1

可以看到Error while creating filesystem xfs on device docker-253:1-697253-base: exit status 1,说明在创建xfs的时候出错了。这是由于系统xfsprogs版本过低造成的,更新一下即可:

yum  install  xfsprogs

再次启动docker,成功。

● docker.service - Docker Application Container Engine

   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)

   Active: active (running) since Sun 2019-12-08 13:32:34 EST; 1s ago

     Docs: https://docs.docker.com

 Main PID: 8649 (dockerd)

   Memory: 42.1M

   CGroup: /system.slice/docker.service

           └─8649 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock



Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.788775621-05:00" level=warning msg="Usage of loopback devi...emapper

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.807063444-05:00" level=warning msg="Base device already ex...emapper

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.820213927-05:00" level=warning msg="mountpoint for pids not found"

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.820398645-05:00" level=info msg="Loading containers: start."

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.917216949-05:00" level=info msg="Default bridge (docker0) ...ddress"

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.957496981-05:00" level=info msg="Loading containers: done."

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.972186739-05:00" level=info msg="Docker daemon" commit=633...19.03.5

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.972251278-05:00" level=info msg="Daemon has completed init...zation"

Dec 08 13:32:34 localhost.localdomain dockerd[8649]: time="2019-12-08T13:32:34.989027383-05:00" level=info msg="API listen on /var/run/docker.sock"

Dec 08 13:32:34 localhost.localdomain systemd[1]: Started Docker Application Container Engine.

Hint: Some lines were ellipsized, use -l to show in full.

停止docker

systemctl  stop  docker

重启docker

systemctl  restart  docker

查看docker状态

systemctl  status  docker

3,设置开机自动启动docker

systemctl  enable  docker

4,Docker的卸载

1)查询docker安装过的包

yum  list  installed | grep docker

2)删除安装包

yum  remove  docker-ce.x86_64  docker-ce-cli.x86_64

3)删除镜像容器等

rm  -rf  /var/lib/docker

  • 三,Docker常用命令

1,镜像相关的命令

1)查看镜像

docker  images

2)搜索镜像

docker  search 镜像名称

比如,docker  search  centos

3)拉取镜像

docker  pull  镜像

比如下载centos7,docker  pull  centos:7,或者docker  pull  guyton/centos6

4)删除镜像

可以按照镜像名称或者id删除

docker  rmi  id

删除所有镜像

docker  rmi  `docker  images  -q`

2,容器相关的命令

1)查看容器

docker  ps

查看所有容器

docker  ps  -a

查看最后一次运行的容器

docker  ps  -l

查看所有停止的容器

docker  ps  -f  status=exited

2)创建与启动容器

创建容器命令:docker  run

-i:表示运行容器

-t:表示容器启动后进入其他命令行。加入这两个参数后,容器创建就能登录进去,分配一个伪终端。

--name:为创建的容器命名

-v:表示目录映射关系(前者表示宿主机目录,后者表示映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行,这样创建的容器不会自动登录容器,如果只加-i  -t两个参数,创建后就自动进去容器

-p:表示终端映射,前者是在宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射。

交互式方式创建容器

docker  run  -it  --name-容器名称  镜像名称:标签 /bin/bash

docker  run  -it  --name=mcentos  centos:7  /bin/bash

守护式方式创建容器

docker  run  -id  --name=容器名称  镜像名称:标签

docker  run  -id  --name=mcentos2  centos:7

进入守护式容器的方式:docker  exec  -it  容器名称或者容器ID  /bin/bash

3)容器的启动与停止

docker  start  容器名称或者id

docker  stop  容器名称或者id

4)文件拷贝

将文件拷贝到容器内

docker  cp  需要拷贝的文件或目录  容器名称:容器目录

将容器内的文件拷贝出来

docker  cp  容器名称:容器目录  需要拷贝的文件或目录

不论容器是否启动,都可以进行拷贝。

5)目录挂载

可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器添加-v参数后边为宿主机目录:容器目录,例如:

docker  run  -di  -v  /usr/local/myhtml:/usr/local/myhtml  --name=mycentos3  centos:7

如果共享的是多级目录,可能会出现权限不足的提示。因为centos7中的安全模块selinux把权限禁了,我们需要添加参数—privileged=true来解决挂载的目录没有权限的问题。

6)查看容器ip地址

查看容器运行的各种数据

docker  inspect  容器名称或id

输入ip地址

docker  inspect  --format=’{{.NetworkSetting.IPAddress}}’  容器名称或id

7)删除容器

docker  rm  容器名称或id

删除容器前需要先停掉容器。docker  stop  容器名称

  • 四,应用部署

1,Mysql部署

拉取mysql镜像

docker  pull  centos/mysql-57-centos7

创建容器

docker  run  -di  --name=mysql1  -p  33066:3306  -e  MYSQL_ROOT_PASSWORD=123456  mysql

-p表示端口映射,格式为宿主机映射端口:容器运行端口

-e表示添加环境变量  MYSQL_ROOT_PASSWORD是root用户的登录密码

2,Tomcat部署

拉镜像

docker  pull  tomcat:7-jre7

创建容器

docker  run  -di  --name=mytomcat1  -p  9000:8080  -v  /usr/local/webapps:/usr/local/tomcat/webapps  tomcat:7-jre7

在宿主机的webapps目录下放war包,自动解压后就可以访问。

3,Nginx部署

拉镜像

docker  pull  nginx

创建容器

docker  run  -di  --name=mynginx  -p  80:80  nginx

4,redis部署

拉镜像

docker  pull  redis

创建容器

docker  run  -di  --name=myredis  -p  6379:6379  redis

  • 五,迁移与备份

1,容器保存为镜像

docker  commit  mytomcat  mytomcat_i

2,镜像备份

docker  save  -o  mytomcat.tar  mytomcat_i

3,镜像回复与迁移

docker  load  -i  mytomcat.tar

-i  表示输入的文件

  • 六,Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。

1,常用命令

FROM  image_name:tag                   定义了使用哪个基础镜像启动构建流程

MAINTRAINER  user_name             声明镜像的创建者

ENV  key  value                                 设置环境变量(可以写多条)

RUN  command                                    是Dockerfile的核心,可以多条

ADD  source_dir/file  dest_dir/file       将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压

COPY  source_dir/file  dest_dir/file     和ADD相似,但是如果是压缩文件并不能解压

WORKDIR  path_dir                            设置工作目录

2,使用脚本创建镜像

使用Dockerfile构建jdk镜像

mkdir  /usr/local/dockerjdk8

进入dockerjdk8目录,copy一份jdk的压缩包进来这个目录,创建Dockerfile文件,内容如下:

FROM  centos:7

MAINTAINER  SSS

WORKDIR  /usr

RUN mkdir  /usr/local/java

ADD  jdk-8u60-linux-x64.gz  /usr/local/java/

ENV  JAVA_HOME  /usr/local/java/jdk1.8.0_60

ENV  JRE_HOME  $JAVA_HOME/jre

ENV  CLASSPATH  $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH

ENV  PATH  $JAVA_HOME/bin:$PATH

在dockerjdk8目录下执行命令:

docker  build  -t='jdk1.8'  .

  • 七,Docker私有仓库

1,私有仓库搭建与配置

拉取私有仓库镜像

docker  pull  registry

启动私有仓库

docker  run  -di  --name=registry  -p  5000:5000  registry

打开浏览器输入地址http://192.xxx.x.xxx:5000/v2/_catalog看到{"repositories":[]}表示私有仓库搭建成功并且内容为空。

修改daemon.json

vi  /etc/docker/daemon.json

添加如下内容:

{"insecure-registries":["192.xxx.x.xxx:5000"]}

用于让docker信任私有仓库地址

2,私有仓库镜像上传

首先对需要上传的镜像打标签

docker  tag  jdk1.8  192.xxx.x.xxx:5000/jdk1.8

然后push

docker  push  192.xxx.x.xxx:5000/jdk1.8

  • 八,Docker maven插件

微服务部署有两种方式,手动部署,首先打成jar包或war包,然后将包上传至虚拟机或拷贝至容器。

通过maven插件自动部署。

Maven插件自动部署步骤:

1,修改宿主机的docker配置,让其可以远程访问

vi  /lib/systemd/system/docker.service

其中ExecStart后添加配置-H  tcp://0.0.0.0:2375  -H  unix:///var/run/docker.sock

2,刷新配置,重启服务

systemctl  daemon-reload

systemctl  restart  docker

docker  start  registry

3,配置pom文件,添加

<build>
    <finalName>app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring‐boot‐maven‐plugin</artifactId>
        </plugin>
        <!--docker的maven插件,官网:https://github.com/spotify/docker‐maven‐plugin-->
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>docker‐maven‐plugin</artifactId>
            <version>0.4.13</version>
            <configuration>
                <imageName>192.168.184.141:5000/${project.artifactId}:${project.version}
                </imageName>
                <baseImage>jdk1.8</baseImage>
                <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]
                </entryPoint>
                <resources>
                    <resource>
                        <targetPath>/</targetPath>
                        <directory>${project.build.directory}
                        </directory>
                        <include>${project.build.finalName}.jar</include>
                    </resource>
                </resources>
                <dockerHost>http://192.168.184.141:2375</dockerHost>
            </configuration>
        </plugin>
    </plugins>
</build>

以上配置自动生成Dockerfile

FROM  jdk1.8

ADD  app.jar  /

ENTRYPOINT  ["java", "-jar", "/app.jar"]

4,打包和上传镜像

使用mvn构建工程,mvn  install

进入相应工程目录,执行mvn  docker:build  -DpushImage

5,进入宿主机,查看镜像

docker  images
浏览器查看私有仓库http://192.xxx.xx.xxx:5000/v2/_catalog

6,启动容器

docker  run  -di  --name=base  -p  9001:9001  镜像名称

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!