数科院博客园 - Docker
type: channel
link: https://blog.icsc.vip/index.php/tag/Docker/
items: Docker中容器和镜像的移植部署
items: 将服务部署至Docker
items: docker学习及golang部署
items: docker镜像
items: Docker
items: 利用Docker制作镜像
items: 使用docker部署tidb集群
items: Docker获取并运行RabbitMQ
items: Docker常用命令

Docker中容器和镜像的移植部署
type: item
date: 2019-11-17T08:29:00+00:00
description: 镜像查看本机镜像docker images先将镜像保存为本地压缩文件，命令：docker save <镜像名称或ID> > <保存路径>如果我们要将yiyu/share保存至/home/zhaoh/exportdocker save yiyu/share > /home/zhaoh/export/share.tar将这个文件移植到另一个虚拟机中，有很多方法。这里建议使用scp进行远程连接Linux scp 命令用于 Linux 之间复制文件和目录，以加密形式进行//简单语法 scp [可选参数] file_source file_target 在本例中，将拥有原镜像文件的虚拟机（IP：192.168.10.100）复制到另一台虚拟机中在另一台虚拟机中执行scp命令即可scp -r root@192.168.10.100:/home/zhaoh/export/share.tar ./因为scp是加密连接，需要输入密码，之后即可下载192.168.10.100中的文件移植成功在另一台虚拟机上输入命令：docker load < share.tar加载成镜像并run容器进行容器打包之前，先停止此容器的运行docker stop <容器ID或名称>打包share容器命令：docker export share > ./share.tar移植压缩包到其他机器使用命令：docker import share.tar share至此机器上已经有一个新的镜像，可以用这个镜像生成容器了。

将服务部署至Docker
type: item
date: 2019-11-10T01:51:00+00:00
description: 怎样将服务部署到Docker如果我们在Windows上写的项目而又需要在Linux上部署，需要先将项目编译成可以在Linux上执行的项目。Golang支持交叉编译，在一个平台上生成另一个平台的可执行程序。交叉编译Windows 下编译 Linux 64 位可执行程序在项目所在根目录下执行：GOOS：目标平台的操作系统（darwin、freebsd、linux、windows）set GOOS=linuxGOARCH：目标平台的体系架构（386、amd64、arm）set GOARCH=amd64编译：go build .此时项目目录下会多出一个文件：使用Xftp将文件移植到Linux系统上打包镜像在编写Dockerfile和打包镜像之前，需要修改workerservice文件权限（可以以后再修改）chmod +x workerservice编写Dockerfile：FROM golang:latest MAINTAINER zshhhca "zhaohengheng@outlook.com" WORKDIR /home/zhaoh/goproject2 ADD workerservice /home/zhaoh/goproject2 ENTRYPOINT ["/home/zhaoh/goproject2/workerservice"]FROM：为后面的指令设置基础镜像。一个有效的Dockerfile文件必须以FROM作为第一条非注释指令MAINTAINER：设置生成的镜像的Author字段WORKDIR：指定工作目录ADD：复制新文件、目录或远程文件URL并添加他们到容器的文件系统路径ENTRYPOINT：ENTRYPOINT允许配置容器作为可执行文件运行Dockerfile和workerservice在同一目录下：打包镜像docker build -t yiyu/worker . //出现一下提示说明构建成功 ...... Successfully built 10669803cb30 Successfully tagged yiyu/worker:latest-t : 镜像的名字及标签，通常 name:tag 或者 name 格式；可以在一次构建中为一个镜像设置多个标签yiyu/worker即是我们镜像仓库的名称查看镜像是否构建成功：docker images启动服务docker run -i -d --name=yiyuworker -p 8081:8081 yiyu/workeryiyuworker是镜像服务名称8081为对外暴漏端口号查看服务是否启动成功完成。服务测试yiyuworker的PROTS是0.0.0.0:8081说明在进行访问时应该输入Linux的IP地址，使用 ip addr 查看IP地址，我的是192.168.10.100postman测试成功返回示例失败返回示例：测试成功。

docker学习及golang部署
type: item
date: 2019-11-06T09:38:00+00:00
description: docker学习及glang部署docker启动sudo systemctl start docker注意：该命令无论在那个目录下执行都能启动docker运行一个容器我们通过 docker 的两个参数 -i -t，让 docker 运行的容器实现"对话"的能力：docker run -i -t ubuntu:15.10 /bin/bash各个参数解析：-t: 在新容器内指定一个伪终端或终端。-i: 允许你对容器内的标准输入 (STDIN) 进行交互。ubuntu:15.10:代表要使用的镜像，如果本地没有他会自动去下载/bin/bash：代表执行该镜像的格式退出容器exit or CTRL+D查看运行中的容器docker ps输出详情介绍：CONTAINER ID: 容器 ID。IMAGE: 使用的镜像。COMMAND: 启动容器时运行的命令。CREATED: 容器的创建时间。STATUS: 容器状态。状态有7种：created（已创建）restarting（重启中）running（运行中）removing（迁移中）paused（暂停）exited（停止）dead（死亡）PORTS: 容器的端口信息和使用的连接类型（tcpudp）。NAMES: 自动分配的容器名称。查看容器内的标准输出： docker logs 容器ID停止容器 docker stop 容器ID重启容器docker restart 容器IDDocker 客户端启动已停止运行的容器查看所有容器docker ps -a注意：这里面的容器ID与docker ps里面的容器ID不同启动一个已经停止的镜像docker start 容器ID注意：这里使用的容器ID与docker ps -a里面的容器ID要保持一致进入容器注意： 如果从这个容器退出，会导致容器的停止。docker attach 容器ID注意： 如果从这个容器退出，不会导致容器的停止，这就是为什么推荐大家使用 docker exec 的原因。更多参数说明请使用 docker exec --help 命令查看。docker exec -it 容器ID /bin/bash导出容器到本地文件如果要导出本地某个容器，可以使用 docker export 命令。注意：ubuntu.tar为本地压缩文件，该命令会把一个容器压缩成一个文件docker export 容器ID > ubuntu.tar删除容器删除容器使用 docker rm 命令：（本人实际测试经验，自己感觉挺麻烦的）**先使用docker ps -a命令查看全部容器 docker ps -a然后使用下面命命令删除，ID为docker ps -a里的ID docker rm 容器ID然后使用下面的命令会发现还是有ubuntu:15.10 docker images接下来使用下面命令删除，这里的ID为docker images出现的ID docker rmi -f 容器ID然后会发现docker images里的ubuntu:15.10被删掉了清理所有处于终止状态下的容器docker container prunedocker镜像使用我们可以使用 docker images 来列出本地主机上的镜像。 docker images runoob@runoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB php 5.6 f40e9e0f10c8 9 days ago 444.8 MB nginx latest 6f8d099c3adc 12 days ago 182.7 MB mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B training/webapp latest 6fae60ef3446 11 months ago 348.8 MB各个选项说明:REPOSITORY：表示镜像的仓库源TAG：镜像的标签IMAGE ID：镜像IDCREATED：镜像创建时间SIZE：镜像大小获取一个新的镜像我们可以使用 docker pull 命令来下载一个新的镜像。Crunoob@runoob:~$ docker pull ubuntu:13.10 13.10: Pulling from library/…

docker镜像
type: item
date: 2019-11-05T14:53:00+00:00
description: Docker的本质是提供“容器”服务，Docker使用的“容器”技术，主要是以Linux的cgroup、namespace等内核特性为基础，保障进程或者进程组处于一个隔离、安全的环境。Docker镜像介绍什么是Docker镜像?据Docker官网的技术文档描述，Image（镜像）是Docker术语的一种，代表一个只读的layer。而layer则具体代表Docker Container文件系统中可叠加的一部分。如此介绍docker镜像，想必理解起也是云里雾里，不如我们先从docker镜像的四个组成说起：rootfs、Union mount、image以及layer。rootfs 代表一个Docker Container在启动时（而非运行后）其内部进程可见的文件系统视角，或者是Docker Container的根目录。传统来说，Linux操作系统内核启动时，内核首先会挂载一个只读（read-only）的rootfs，当系统检测其完整性之后，决定是否将其切换为读写（read-write）模式，或者最后在rootfs之上另行挂载一种文件系统并忽略rootfs。Docker架构下，依然沿用Linux中rootfs的思想。当Docker Daemon为Docker Container挂载rootfs的时候，与传统Linux内核类似，将其设定为只读（read-only）模式。在rootfs挂载完毕之后，和Linux内核不一样的是，Docker Daemon没有将Docker Container的文件系统设为读写（read-write）模式，而是利用Union mount的技术，在这个只读的rootfs之上再挂载一个读写（read-write）的文件系统，挂载时该读写（read-write）文件系统内空无一物。 观察图可以发现：容器虽然只有一个文件系统，但该文件系统由“两层”组成，分别为读写文件系统和只读文件系统。这样的理解已然有些层级（layer）的意味。Union mount代表一种文件系统挂载的方式，允许同一时刻多种文件系统挂载在一起，并以一种文件系统的形式，呈现多种文件系统内容合并后的目录。一般情况下，通过某种文件系统挂载内容至挂载点的话，挂载点目录中原先的内容将会被隐藏。而Union mount则不会将挂载点目录中的内容隐藏，反而是将挂载点目录中的内容和被挂载的内容合并，并为合并后的内容提供一个统一独立的文件系统视角。通常来讲，被合并的文件系统中只有一个会以读写（read-write）模式挂载，而其他的文件系统的挂载模式均为只读（read-only）。实现这种Union mount技术的文件系统一般被称为Union Filesystem。可以暂且将该容器整个rootfs当成是一个文件系统。上文也提到，挂载时读写（read-write）文件系统中空无一物。既然如此，从用户视角来看，容器内文件系统和rootfs完全一样，用户完全可以按照往常习惯，无差别的使用自身视角下文件系统中的所有内容；然而，从内核的角度来看，两者在有着非常大的区别。追溯区别存在的根本原因，那就不得不提及AUFS等文件系统的COW（copy-on-write）特性。COW文件系统和其他文件系统最大的区别就是：从不覆写已有文件系统中已有的内容。由于通过COW文件系统将两个文件系统（rootfs和read-write filesystem）合并，最终用户视角为合并后的含有所有内容的文件系统，然而在Linux内核逻辑上依然可以区别两者，那就是用户对原先rootfs中的内容拥有只读权限，而对read-write filesystem中的内容拥有读写权限。imageDocker中rootfs的概念，起到容器文件系统中基石的作用。对于容器而言，其只读的特性，也是不难理解。神奇的是，实际情况下Docker的rootfs设计与实现比上文的描述还要精妙不少。虽然通过Union mount可以实现rootfs与read-write filesystem的合并，但是考虑到rootfs自身接近200MB的磁盘大小，如果以这个rootfs的粒度来实现容器的创建与迁移等，是否会稍显笨重，同时也会大大降低镜像的灵活性。而且，若用户希望拥有一个ubuntu 14.10的rootfs，那么是否有必要创建一个全新的rootfs。Docker中image的概念，非常巧妙的解决了以上的问题。最为简单的解释image，就是 Docker容器中只读文件系统rootfs的一部分。换言之，实际上Docker容器的rootfs可以由多个image来构成。多个image构成rootfe的示意图如下：图中的容器rootfs包含4个image，其中每个image中都有一些用户视角文件系统中的一部分内容。4个image处于层…

Docker
type: item
date: 2019-10-30T13:44:00+00:00
description: dockerDocker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发，并遵从Apache 2.0协议。目前，Docker可以在容器内部快速自动化部署应用，并可以通过内核虚拟化技术（namespaces及cgroups等）来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离，所以Docker容器在运行时，不需要类似虚拟机（VM）额外的操作系统开销，提高资源利用率，并且提升诸如IO等方面的性能.docker架构Docker对使用者来讲是一个C/S模式的架构，而Docker的后端是一个非常松耦合的架构，模块各司其职，并有机组合，支撑Docker的运行。不难看出，用户是使用Docker Client与Docker Daemon建立通信，并发送请求给后者而Docker Daemon作为Docker架构中的主体部分，首先提供Server的功能使其可以接受Docker Client的请求；而后Engine执行Docker内部的一系列工作，每一项工作都是以一个Job的形式的存在。Job的运行过程中，当需要容器镜像时，则从Docker Registry中下载镜像，并通过镜像管理驱动graphdriver将下载镜像以Graph的形式存储；当需要为Docker创建网络环境时，通过网络管理驱动networkdriver创建并配置Docker容器网络环境；当需要限制Docker容器运行资源或执行用户指令等操作时，则通过execdriver来完成。而libcontainer是一项独立的容器管理包，networkdriver以及execdriver都是通过libcontainer来实现具体对容器进行的操作。当执行完运行容器的命令后，一个实际的Docker容器就处于运行状态，该容器拥有独立的文件系统，独立并且安全的运行环境等。Docker架构内各模块的功能与实现分析docker 架构中的主要模块有：Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。Docker ClientDocker Client是Docker架构中用户用来和Docker Daemon建立通信的客户端，与Docker Daemon建立连接并传输请求的时候，Docker Client可以通过设置命令行flag参数的形式设置安全传输层协议(TLS)的有关参数，保证传输的安全性。 注意，Docker Client的生命周期是有限的，Docker Client发送容器管理请求后，由Docker Daemon接受并处理请求，当Docker Client接收到返回的请求相应并简单处理后，Docker Client一次完整的生命周期就结束了。当需要继续发送容器管理请求时，用户必须再次通过docker可执行文件创建Docker Client。Docker DaemonDocker Daemon是Docker架构中一个常驻在后台的系统进程，功能是：接受并处理Docker Client发送的请求。该守护进程在后台启动了一个Server，Server负责接受Docker Client发送的请求；接受请求后，Server通过路由与分发调度，找到相应的Handler来执行请求。Docker Server Docker Server 的功能是接受并调度分发Docker Client发送的请求。在Docker的启动过程中，通过包gorilla/mux，创建了一个mux.Router，提供请求的路由功能。在Golang中，gorilla/mux是一个强大的URL路由器以及调度分发器。该mux.Router中添加了众多的路由项，每一个路由项由HTTP请求方法（PUT、POST、GET或DELETE）、URL、Handler三部分组成。EngineEngine是Docker架构中的运行引擎，同时也Docker运行的核心模块。它扮演Docker container存储仓库的角色，并且通过执行job的方式来操纵管理这些容器。Job一个Job可以认为是Docker架构中Engine内部最基本的工作执行单元。Docker可以做的每一项工作，都可以抽象为一个job。Docker RegistryDocker Registry是一个存储容器镜像的仓库。而容器镜像是在容器被创建时，被加载用来初始化容器的文件架构与目录。GraphGraph在Docker架构中扮演已下载容器镜像的保管者，以及已下载容器镜像之间关系的记录者。一方面，Graph存储着本地具有版本信息的文件系统镜像，另一方面也通过GraphDB记录着所有文件系统镜像彼此之间的关系。Dr…

利用Docker制作镜像
type: item
date: 2019-10-25T08:46:00+00:00
description: docker使用的优点容器可以提供隔离性，可以为各种测试提供一个良好的沙盒环境。并且，容器本身就是具有“标准性”的特征，非常适合为服务创建构建块。让不同的环境中得到相同的运行结果，一个多用户平台及服务基础措施使用 docker commit 来扩展一个镜像比较简单，但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此，首先需要创建一个 Dockerfile，包含一些如何创建镜像的指令。编写Dockerfile文件From指令告诉Docker使用哪个镜像作为基础MAINTAINER指令是维护者信息WOERKDIR指令工作目录Run开头的指令会在创建中运行生成镜像docker build -t ada/lts . ada/lts 生成的镜像名称这样我们会生成一个docker镜像，可以通过docker images来查看已有的镜像这样就生成了一个简单的镜像文件我们可以通过docker run -i -d -p 8080:8080 ada/lts来运行它-i以交互模式运行容器，通常与-t同时使用-d表示后台运行-p指定端口映射我们这里只用了这几个参数还可以使用--name=“”为该容器指定一个名称每个容器就相当于一个linux纯净版的虚拟机+项目每次使用docker run来启动一个docker镜像就会开启一个新的容器可以使用docker ps -a来查看已开启的容器这样我就可以使用镜像中的应用程序了docker可以节省项目环境的部署时间一次构建多次部署，团队开发环境一致

使用docker部署tidb集群
type: item
date: 2019-09-04T06:26:00+00:00
description: 在安装tidb集群时我使用docker进行部署，当然我只是测试一下数据，当我们在生产环境下我们不要使用docker进行部署，我们应该使用Ansible进行部署，因为我的虚拟机之前安装docker，首先我们吧linux自带的docker卸掉(如果系统没有的话请忽略这步) 1.我们在命令行输入： yum remove -y docker docker-common docker-selinux docker-engine。 然后我们安装yum-utils，device-mapper-persistent，lvm2 yum install -y yum-utils device-mapper-persistent-data lvm2 添加yum源配置，系统自带的库可能没有我们所需的软件，所以我们自行添加yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 接下来我们就可以开始安装docker并设置开机自行启动。 yum install docker-ce -y systemctl start docker systemctl enable docker 2.安装完之后我们还需要安装mysql，因为当我们配置好tidb集群的时候，我们需要使用mysql进行连接， 下载并安装mysql官方yum reoisitory wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 然后直接yum进行安装 yum -y install mysql57-community-release-el7-10.noarch.rpm 然后安装mysql服务器 yum -y install mysql-community-server 可以测试一下mysql是否安装成功 mysql -version 测试一下是否可以登陆,首先我们先找到数据库密码 grep "password" /var/log/mysqld.log root@localhost：后面跟的就是密码， mysql -uroot -p 然后输入密码 进去之后必需的修改一个新的密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'; 3.部署tidb集群 我们采用两个主机，一个pd，一个kv，pb这台主机主要是负责运算，而kv这台主机主要负责的是存储，pd的ip: 192.168.10.140，kv的ip:192.168.24.144 然后登陆pd主机创建并运行一个容器： docker run -d --name pd1 \ -p 2579:2579 \ //开放的端口 -p 2382:2382 \ -v /etc/localtime:/etc/localtime:ro \ //挂载目录 -v /data:/data \ pingcap/pd:latest \ --name="pd1" \ //指定容器名称 --data-dir="/data/pd1" \ //所存放数据的目录 --client-urls="http://0.0.0.0:2579" \ //客户端地址 --advertise-client-urls="http://192.168.10.140:2579" \ --peer-urls="http://0.0.0.0:2382" \ --advertise-peer-urls="http://192.168.10.140:2382" \ --initial-cluster="pd1=http://192.168.10.140:2382" 然后登陆kv，创建并运行另一个容器 docker run -d --name tikv1 \ -p 20160:20160 \ --ulimit nofile=1000000:1000000 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/tikv:latest \ --addr="0.0.0.0:20160" \ --advertise-addr="192.168.24.143:20160" \ --data-dir="/data/tikv1" \ --pd="192.168.10.140:2579" 然后我们登陆pd这台主机执行 docker run -d --name tidb \ -p 4000:4000 \ -p 10080:10080 \ -v /etc/local…

Docker获取并运行RabbitMQ
type: item
date: 2019-06-18T11:52:00+00:00
description: Docker获取并运行RabbitMQ1.搜索RabbitMQ镜像Docker搜索Rabbitmq镜像. docker search rabbitmq2.拉取镜像我们选择官方版本的,也就是第一个.通过这个镜像创建的容器需要我们额外打开web management的插件,若不想手动开启,可下载 rabbitmq/managementdocker pull rabbitmq3. 创建容器.镜像下载后,通过该镜像创建一个容器.**docker run -d --hostname my-rabbit -p 5671:5671 -p 5672:5672 -p 15671:15671 -p 15672:15672 -p 25672:25672 -p 4369:4369 -v $PWD/rabbitmq-data:/var/rabbitmq/lib --name my_rabbitmq rabbitmq:latest 参数介绍:-d:后台运行容器.--hostname:指定主机名.-p:指定端口映射.-v:文件目录映射.--name:定义容器名称.4. 查看日志.docker logs my_rabbitmq 5.开启插件如果使用的镜像为rabbitmq/management,到此步可直接浏览器访问localhost:15672;若使用rabbitmq镜像,我们需要进入docker,开启rabbitmq-management插件.docker exec -it my_rabbitmq /bin/bashls 可以看到有plugins插件的目录,我们需要用到的插件都在里面,使用命令即可开启插件.cd plugins rabbitmq-plugins enable rabbitmq_management 6.访问Rabbit的页面

Docker常用命令
type: item
date: 2019-06-18T01:21:00+00:00
description: Docker常用命令例如，我们需要拉取一个 docker 镜像，我们可以用如下命令：docker pull image_nameimage_name 为镜像的名称，而如果我们想从 Docker Hub 上去下载某个镜像，我们可以使用以下命令：docker pull centos:latestcentos:lastest 是镜像的名称， Docker daemon 发现本地没有我们需要的镜像，会自动去 Docker Hub 上去下载镜像，下载完成后，该镜像被默认保存到 /var/lib/docker 目录下。接着我们如果想查看下主机下存在多少镜像，我们可以用如下命令：docker images我们要想知道当前有哪些容器在运行，我们可以用如下命令：docker ps -a-a 是查看当前所有的容器，包括未运行的我们该如何去对一个容器进行启动，重启和停止呢？我们可以用如下命令：docker start container_name/container_iddocker restart container_name/container_iddocker stop container_name/container_id这个时候我们如果想进入到这个容器中，我们可以使用 attach 命令：docker attach container_name/container_id那如果我们想运行这个容器中的镜像的话，并且调用镜像里面的 bash ，我们可以使用如下命令：docker run -t -i container_name/container_id /bin/bash那如果这个时候，我们想删除指定镜像的话，由于 image 被某个 container 引用（拿来运行），如果不将这个引用的 container 销毁（删除），那 image 肯定是不能被删除。我们首先得先去停止这个容器：docker psdocker stop container_name/container_id然后我们用如下命令去删除这个容器：docker rm container_name/container_id然后这个时候我们再去删除这个镜像：docker rmi image_name附一张图