docker

 什么是docker?

DockerDocker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,源代码托管在GitHub上,基于Go语言并遵从Apache2.0协议开源(可以商业)。

 

Docker项目的目标是实现轻量级的操作系统虚拟化解决方案。

 

Docker是通过内核虚拟化技术(namespacescgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机VM额外的操作系统开销,提高资源利用率。

 

比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复制本地主机的操作系统,而传统方式则是在硬件层面实现。

Docker 内部

要理解 Docker 内部构建,需要理解以下三种部件:

Docker镜像 - Docker p_w_picpaths

Docker仓库 - Docker registeries

Docker容器 - Docker containers

Docker 镜像

Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker是如此的轻量。当你改变了一个Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

 

Docker 仓库

Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker HubDocker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

 

Docker 容器

Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分

 

                          Docker的工作模式

学习Docker的源码并不是一个枯燥的过程,反而可以从中理解Docker架构的设计原理。

 

Docker对使用者来讲是一个C/S模式的架构,而Docker的后端是一个非常松耦合的架构,模块各司其职,并有机组合,支撑Docker的运行。

 

用户是使用DockerClientDocker 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容器就处于运行状态,该容器拥有独立的文件系统,独立并且安全的运行环境等。

 

                         Dcoerk八中应用场景

1、简化配置,统一配置,通过镜像快速启动(Simplifying)

2、代码流水线管理,开发环境->测试环境->预生产环境->灰度发布->正式发布,docker在这里实现了快速迁移(Code Oioeline Management)

3、开发效率,对开发人员,有了镜像,直接启动容器即可(Developer Productivity)

4、应用隔离,相对于虚拟机的完全隔离会占用资源,docker会比较节约资源(App lsolation)

5、服务器整合,一台服务器跑多个docker容器,提高服务器的利用率(Server Consolidation)

6、调试能力,debug调试(DebuggingCapabilties)

7、多租户,一个租户多个用户,类似于阿里公有云的一个project下多个用户(Multi-tenancy)

8、快速部署,不需要启动操作系统,实现秒级部署(Rapid Deplovment)

 

                       Docker八种开发模式

1.共享基础容器

2.共享卷开发容器

3.开发工具容器

4.不同环境下测试容器

5.构建容器

6.安装容器

7.盒子中默认服务容器

8.基础设施/粘合剂容器

 

                           Docker九个基本事实

1.容器不同于虚拟机

2.容器不如虚拟机来得成熟

3.容器可以在几分之一秒内启动

4.容器已在大规模环境证明了自身的价值

5.IT人员称容器为轻量级

6.容器引发了安全问题

7.Docker已成为容器的代名词,但它不是唯一的提供者

8.容器能节省IT人力,加快更新

9.容器仍面临一些没有解决的问题

 

使用Docker理由

作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式具有众多的优势。

 

首先,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker对系统资源的利用率很低,一台主机上可以同时运行数千个Docker容器。

 

至于为什么要使用Docker

1、技术储备

相对大公司这个非常重要,如果你们都在用,他们不用就落后了,等到完全成熟以后就跟不上了。

2、无技术栈和技术债

没有任何Openstack或者saltstack,服务down了就down,所有的服务都是松耦合。

3、跟上潮流(提升自我,装逼)

面试的时候大家都会Docker,你不会是不是落后了。

4、符合当前业务

虽然Docker很优秀,但是,大多数处在第二种状态,很少有符合自己的业务

 

 

                        Docker改变了什么

面向产品:产品交付

● 面向开发:简化环境配置

● 面向测试:多版本测试

● 面向运维:环境一致性

● 面向架构:自动化扩容(微服务)

Docker更快速的交付和部署

对于开发和人员来说,最希望的就是一次创建和配置,可以在任意地方正常运行。

 

开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全称可见,使团队中的其他成员更容易理解应用程序是如何创建和工作。Docker容器很轻很快!容器的启动时间是秒级的,大量第节约开发、测试、部署的时间。

 

Docker更高效的虚拟化

Docker容器的运行不需要额外的Hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。

 

Docker更轻松的迁移和扩展

Docker容器几乎可以字啊任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。

 

Docker更简单的管理

使用Docker,只需要小小的修改,就可以替代往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

 

Docker与虚拟化

Docker与虚拟化

类别

Docker

OpenStack

结论

部署难度

非常简单

组件多,部署复杂

因为平台是对已有的线上生产环境进行改造,必须选择侵入性较小的容器化技术

启动速度

秒级

分钟级

面对流量峰值,速度就是一切

执行性能

和物理系统几乎一致

VM会占用一些资源

微博核心业务对服务SLA要求非常苛刻

镜像体积

镜像是MB级别

虚拟机镜像是GB级别

当集群大规模部署时,体积小就代表更大的并发调度量

管理效率

管理简单

组件相互依赖,管理复杂

生产系统集群可控性是核心竞争力

隔离性

隔离性高

彻底隔离

可管理性能

单进程、不建议启动SSH

完整的系统管理

网络连接

比较弱

借助Neutron可以灵活组建各类网络架构

 

Docker三大核心概念

Docker镜像(p_w_picpath)

Docker镜像就是一个只读的模板。

 

例如:一个镜像可以包含一个完整的CentOS操作系统环境,里面仅安装了Apache或用户需要的其他应用程序。

 

镜像可以用来创建Docker容器。

 

Docker提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。

 

Docker容器(container)

Docker利用容器来运行应用。

 

容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的,保证安全的平台。

 

可以把容器看做是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

 

注意:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。

 

Docker仓库(repository)

仓库是集中存放镜像文件的场所。有时候把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)

 

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

 

最大的公开仓库是DockerHub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括Docker Pool等,可以提供大陆用户更稳定快读的访问。

 

当用户创建了自己的镜像之后就可以使用push命令将它上传到公有或者私有仓库,这样下载在另外一台机器上使用这个镜像时候,只需需要从仓库上pull下来就可以了。

 

注意:Docker仓库的概念跟Git类似,注册服务器可以理解为GitHub这样的托管服务。

 

                   Docker企业实战

系统环境

[root@docker~]# cat/etc/redhat-release #查看版本号

CentOSLinux release 7.2.1511 (Core)

 

[root@docker ~]# uname -r #查看Linux内核

c3.10.0-229.el7.x86_64

 

[root@docker ~]#yum install -y docker

#安装docker(CentOS7系统CentOS-Extras库中已带Docker)

 

[root@docker~]#systemctlstart docker

#启动docker

 

[root@docker~]#systemctlenable docker

#加入开机自启动

 

[root@docker~]# dockerversion

#查看docker版本信息

Client:#docker客户端版本信息

Version:1.8.2-el7.centos

API version:1.20

PackageVersion: docker-1.8.2-10.el7.centos.x86_64

Go version:go1.4.2

Git commit:a01dc02/1.8.2

Built:

OS/Arch:linux/amd64

Server:#docker服务端版本信息

Version:1.8.2-el7.centos

API version:1.20

PackageVersion:

Go version:go1.4.2

Git commit:a01dc02/1.8.2

Built:

OS/Arch:linux/amd6

 

Docker基础命令

[root@docker~]# docker–help

 

Usage:docker [OPTIONS] COMMAND [arg…]

 

dockerdaemon [ –help | … ]

 

docker [–help | -v | –version ]

 

Aself-sufficient runtime for containers.

 

Options:

–config=~/.docker Location of client configfiles #客户端配置文件的位置

-D, –debug=falseEnable debug mode #启用Debug调试模式

-H, –host=[]Daemon socket(s) to connect to #守护进程的套接字(Socket)连接

-h, –help=falsePrint usage #打印使用

-l, –log-level=infoSet the logging level #设置日志级别

–tls=false Use TLS; implied by –tlsverify #

–tlscacert=~/.docker/ca.pem Trust certssigned only by this CA #信任证书签名CA

–tlscert=~/.docker/cert.pem Path to TLScertificate file #TLS证书文件路径

–tlskey=~/.docker/key.pem Path to TLS keyfile #TLS密钥文件路径

–tlsverify=false Use TLS and verify theremote #使用TLS验证远程

-v, –version=falsePrint version information and quit #打印版本信息并退出

Commands:

attach Attach to a running container #当前shell下attach连接指定运行镜像

build Build an p_w_picpath from a Dockerfile #通过Dockerfile定制镜像

commit Create a new p_w_picpath from acontainer’s changes #提交当前容器为新的镜像

cp Copy files/folders from a container toa HOSTDIR or to STDOUT #从容器中拷贝指定文件或者目录到宿主机中

create Create a new container #创建一个新的容器,同run 但不启动容器

diff Inspect changes on a container’s filesystem #查看docker容器变化

events Get real time events from theserver #从docker服务获取容器实时事件

exec Run a command in a running container#在已存在的容器上运行命令

export Export a container’s filesystem as a tar archive #导出容器的内容流作为一个tar归档文件(对应import)

history Show the history of an p_w_picpath #展示一个镜像形成历史

p_w_picpaths List p_w_picpaths #列出系统当前镜像

import Import the contents from a tarballto create a filesystem p_w_picpath #从tar包中的内容创建一个新的文件系统映像(对应export)

info Display system-wide information #显示系统相关信息

inspect Return low-level information on acontainer or p_w_picpath #查看容器详细信息

kill Kill a running container #kill指定docker容器

load Load an p_w_picpath from a tar archive orSTDIN #从一个tar包中加载一个镜像(对应save)

login Register or log in to a Dockerregistry #注册或者登陆一个docker源服务器

logout Log out from a Docker registry #从当前Docker registry退出

logs Fetch the logs of a container #输出当前容器日志信息

pause Pause all processes within acontainer #暂停容器

port List port mappings or a specificmapping for the CONTAINER #查看映射端口对应的容器内部源端口

ps List containers #列出容器列表

pull Pull an p_w_picpath or a repository from aregistry #从docker镜像源服务器拉取指定镜像或者库镜像

push Push an p_w_picpath or a repository to aregistry #推送指定镜像或者库镜像至docker源服务器

rename Rename a container #重命名容器

restart Restart a running container #重启运行的容器

rm Remove one or more containers #移除一个或者多个容器

rmi Remove one or more p_w_picpaths #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)

run Run a command in a new container #创建一个新的容器并运行一个命令

save Save an p_w_picpath(s) to a tar archive #保存一个镜像为一个tar包(对应load)

search Search the Docker Hub for p_w_picpaths #在docker hub中搜索镜像

start Start one or more stoppedcontainers #启动容器

stats Display a live stream ofcontainer(s) resource usage statistics #统计容器使用资源

stop Stop a running container #停止容器

tag Tag an p_w_picpath into a repository #给源中镜像打标签

top Display the running processes of acontainer #查看容器中运行的进程信息

unpause Unpause all processes within acontainer #取消暂停容器

version Show the Docker versioninformation #查看容器版本号

wait Block until a container stops, thenprint its exit code #截取容器停止时的退出状态值

Run ‘docker COMMAND –help’ for moreinformation on a command.

#运行docker命令在帮助可以获取更多信息

 

 

安装docker

第一步:下载yum安装包

yum install docker -y

第二步:加入开机自启动

systemctl enable docker

 

第三步:更改配置文件

登录阿里云网站寻找镜像地址

修改配置文件 在固定的行添加上--registry-mirror=https://2b2oi9ju.mirror.aliyuncs.com

vim /usr/lib/systemd/system/docker.service

[Unit]

Description=Docker Application Container Engine

Documentation=http://docs.docker.com

After=network.target

Wants=docker-storage-setup.service

Requires=docker-cleanup.timer

 

[Service]

Type=notify

NotifyAccess=all

KillMode=process

EnvironmentFile=-/etc/sysconfig/docker

EnvironmentFile=-/etc/sysconfig/docker-storage

EnvironmentFile=-/etc/sysconfig/docker-network

Environment=GOTRACEBACK=crash

Environment=DOCKER_HTTP_HOST_COMPAT=1

Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin

ExecStart=/usr/bin/dockerd-current --registry-mirror=https://2b2oi9ju.mirror.aliyuncs.com\

          --add-runtimedocker-runc=/usr/libexec/docker/docker-runc-current \

         --default-runtime=docker-runc \

         --exec-opt native.cgroupdriver=systemd \

         --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \

          $OPTIONS\

         $DOCKER_STORAGE_OPTIONS \

         $DOCKER_NETWORK_OPTIONS \

         $ADD_REGISTRY \

         $BLOCK_REGISTRY \

         $INSECURE_REGISTRY

ExecReload=/bin/kill -s HUP $MAINPID

LimitNOFILE=1048576

LimitNPROC=1048576

LimitCORE=infinity

TimeoutStartSec=0

Restart=on-abnormal

MountFlags=slave

 

[Install]

WantedBy=multi-user.target

第四步:

重启一下

  systemctl daemon-reload

第五步:

打开docker

  systemctlstart docker

 

第六步:检查docker状态,是否打开成功

[root@centos7 ~]# systemctlstatus docker

● docker.service - Docker Application ContainerEngine

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

   Active: active(running) since Fri 2017-07-14 09:15:30 CST; 5min ago

     Docs:http://docs.docker.com

 Main PID: 6093(dockerd-current)

   CGroup:/system.slice/docker.service

           ├─6093 /usr/bin/dockerd-current --registry-mirror=http...

           └─6097 /usr/bin/docker-containerd-current -l unix:///v...

 

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

Jul 14 09:15:30 centos7 systemd[1]: Started DockerApplication C....

Jul 14 09:15:30 centos7 dockerd-current[6093]:time="2017-07-14T0...

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

 

 

下载alpine镜像

docker pull alpine

 

  

查找 nginx 镜像文件

[root@centos7 ~]# docker search nginx

INDEX      NAME                                              DESCRIPTION                                     STARS     OFFICIAL  AUTOMATED

docker.io  docker.io/nginx                                    Officialbuild of Nginx.                        6411      [OK]      

docker.io  docker.io/jwilder/nginx-proxy                      Automated Nginx reverseproxy for docker c...   1064                 [OK]

docker.io  docker.io/richarvey/nginx-php-fpm                  Container running Nginx +PHP-FPM capable ...   406                  [OK]

docker.io  docker.io/jrcs/letsencrypt-nginx-proxy-companion   LetsEncrypt container to use with nginxas...   200                  [OK]

docker.io  docker.io/kong                                     Open-sourceMicroservice & API Management ...  88        [OK]      

docker.io  docker.io/webdevops/php-nginx                      Nginx with PHP-FPM                              85                   [OK]

docker.io  docker.io/bitnami/nginx                           Bitnami nginx DockerImage                      30                   [OK]

docker.io  docker.io/linuxserver/nginx                        An Nginx container,brought to you by Linu...   20                  

docker.io  docker.io/tutum/nginx                              Base Docker Image to runNginx server           10                  

docker.io  docker.io/webdevops/nginx                          Nginx container                                 8                    [OK]

docker.io  docker.io/blacklabelops/nginx                      Dockerized Nginx ReverseProxy Server.          5                    [OK]

docker.io  docker.io/nginxdemos/nginx-ingress                 NGINX Ingress Controller forKubernetes         5                   

docker.io   docker.io/1science/nginx                           Nginx Docker p_w_picpathsthat include Consul Te...   4                    [OK]

docker.io  docker.io/ixbox/nginx                              Nginx on AlpineLinux.                          3                    [OK]

docker.io  docker.io/nvucinic/nginx                           Simple nginxp_w_picpath                              3                   

docker.io  docker.io/phpdockerio/nginx                        Note: p_w_picpath is nowdeprecated, here only t...   2                    [OK]

docker.io  docker.io/pebbletech/nginx-proxy                   nginx-proxy sets up acontainer running ng...   1                    [OK]

docker.io  docker.io/schmunk42/nginx                          Legacy nginxp_w_picpath                              1                   

docker.io  docker.io/xutongle/nginx                           nginx http                                      1                    [OK]

docker.io  docker.io/jenkler/nginx                            Docker Nginxpackage                            0                   

docker.io  docker.io/mailu/nginx                              Mailu nginxfrontend                            0                    [OK]

docker.io  docker.io/tcaxias/nginx                            Nginx container toserver static content w...   0                    [OK]

docker.io  docker.io/travix/nginx                             NGinx reverseproxy                             0                    [OK]

docker.io  docker.io/vukor/nginx                             Build for Nginx. Projectavailable on http...   0                    [OK]

docker.io  docker.io/watsco/nginx                            nginx:1.11-alpine                               0                    [OK]

 

下载nginx镜像文件

docker pull nginx

 

查看本机下载好的镜像

docker p_w_picpaths

 

导出操作

docker save nginx >/tmp/nginx.tar.gz

 

[root@centos7 ~]# cd /tmp/

[root@centos7 tmp]# ll

total 108608

-rw-r--r-- 1 root root 111210496 Jul 14 09:57 nginx.tar.gz

drwx------ 2 root root         6 Jul 14 09:15tmp.hB45j5rpnN

[root@centos7 tmp]# tar xf nginx.tar.gz

tar: manifest.json: implausibly old time stamp1970-01-01 08:00:00

tar: repositories: implausibly old time stamp1970-01-01 08:00:00

 

 

删除镜像的操作(能不用尽量不用)

docker rmi nginx

 

导入镜像的操作

docker load < /tmp/nginx.tar.gz

 

镜像的常见操作五个操作步骤

1 搜索

2 下载

3 导入

4 导出

5 删除

 

 

默认存储的目录/var/lib/docker/

 

更换存储目录

--graph=/opt/docker

dns服务

默认docker是采用宿主机的dns

可以采用--dns=xxxx的方式制定

 

 

 

docker daemon --help 查看docker 的帮助

 

 

dockerrun alpine sh

run = cleate+ start

 

进入容器

dockerrun -it alpine sh

  

docker run- 运行一个容器

-t  分配一个(伪)tty(link is external)

-i  交互模式 (sowe can interact with it)

 

正在运行的容器有那些

docker ps

 

 

想要退出但是还想容器正在运行的方法

按住ctrl不放手,按一下p 按一下q 就好了。

 

显示所有的容器(不管关闭还是打开)

docker ps -a

[root@centos7 docker]# docker ps -a

CONTAINER ID       IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

1a7da0cfb507       alpine             "sh"                3minutes ago       Exited (0) 3 minutesago                       reverent_darwin

a5059f339762       alpine             "sh"                3minutes ago       Exited (0) 3 minutesago                       compassionate_rosalind

28d29bfdbe90       alpine             "sh"                5minutes ago       Up 5 minutes                                   condescending_chandrasekhar

805ae1d79c82       alpine              "sh"                10 minutes ago      Exited (0) 6 minutes ago                        elegant_ramanujan

5b0339fee0d8       alpine             "sh"                10minutes ago      Exited (0) 10 minutesago                       drunk_cori

073ab3b420bc        alpine              "sh"                10 minutes ago      Exited (0) 10 minutes ago                       goofy_swirles

删除容器(删除前面-a查到的ID号就可以)

docker rm 073ab3b420bc

 

正在运行的容器删不了的话

docker rm -f  ID号(加上-f强制删除)

 

 

指定容器名进行创建容器

docker run -it --name mynginx nginx

 

inspect查看容器的详细信息

docker inspect mynginx

 

 

--rm退出时自动进行删除

docker run -it --rm --name mynginx nginx

 

 

进入容器进行操作的三种方式

方法一:

attach  不推荐

docker attcah 容器名/ID  这种实时操作,别的终端也能看见你操作的内容

 

方法二:

exec 比较推荐

docker exec -it 容器名/ID sh

优点: 不会对其他用户有影响(操作层面)

 

第三种:

通过查看容器的空间进行进入

得先安装 yum install util-linux命令

 

开两个xshell窗口 一个执行下面的打开容器的命令

[root@centos7 docker]# docker run -it --rm --name mynginx nginx

 

另一个编写一个脚本

[root@centos7 ~]# cat docker_in.sh

#!/bin/bash

 

pid=`docker inspect --format"``.`State`.`Pid`" $1`

nsenter -t $pid -m -u -i -n -p

 

sh docker_in.sh 容器名/ID

这样就进入了容器

 

 

后台运行容器的操作命令

docker run -it -d --name mynginx nginx

 

查看当前访问的日志(只能查看最后一条)

docker logs mynginx

 

 

 

临时开一终端,实时查看当前访问的日志

docker logs  -f mynginx

 

杀死容器

docker kill xxx

关闭容器

docker stop xxx

 

-v 挂载

docker run -it --rm -v/opt/nginx:/usr/share/nginx/html -p80:80 nginx

 

删除的话需要加v

docker rm -fv 容器名/ID

 

docker 镜像制作

简单的制作镜像的方式

centos为基础

先执行

docker pull centos

然后在run一个容器

docker run -it centos bash

就进入了容器

 

下载wgetyum

cd /etc/yum.repos.d/

yum install wget -y

rm -rf *

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-7.repo

 

下载nginx 服务,因为我们要做一个nginx镜像

yum install nginx -y

下载完成后修改配置文件

 

vi /etc/nginx/nginx.conf

user nginx;

添加 daemon off;

[root@d4bbca6b4a94 yum.repos.d]# cat/etc/nginx/nginx.conf

# For more information on configuration, see:

#   *Official English Documentation: http://nginx.org/en/docs/

#   *Official Russian Documentation: http://nginx.org/ru/docs/

 

user nginx;

daemon off;

worker_processes auto;

error_log /var/log/nginx/error.log;

pid /run/nginx.pid;

 

nginx -t检查

 

在执行 nginx

如果卡的不动说明执行成功了。

 

 

 

 

docker commit --help 查看帮助

[root@centos7 ~]# docker commit --help

 

Usage:  dockercommit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

 

Create a new p_w_picpath from a container's changes

 

Options:

  -a,--author string    Author (e.g.,"John Hannibal Smith <hannibal@a-team.com>")

  -c,--change value     Apply Dockerfileinstruction to the created p_w_picpath (default [])

     --help             Print usage

  -m,--message string   Commit message

  -p,--pause            Pause container duringcommit (default true)

-a,作者字符串作者(例如,“John Hannibal Smith的”,“他的团队”

-c——更改值将Dockerfile指令应用到创建的映像(默认)

——帮助打印使用

-m,消息字符串提交消息

-p,在提交期间暂停暂停容器(默认true)

 

容器制作镜像的过程

添加镜像

docker commit -m 'add nginx p_w_picpaths' 容器名/ID 镜像名:TAG号(自己可以添加)

docker commit -m 'add nginx p_w_picpaths' mynginx lsy/my_nginx:V1

 

检查镜像是否添加成功

添加完成后docker p_w_picpaths查看 是否添加成功

 

 

[root@centos7 ~]# docker commit -m 'add nginx p_w_picpaths'mynginx lsy/my_nginx:V1

sha256:5f22d143d7d83723af8025cbb0cbdc8fdb882cd2613a9594759957633402b12d

[root@centos7 ~]# docker p_w_picpaths

REPOSITORY         TAG                 IMAGE ID            CREATED             SIZE

lsy/my_nginx       V1                  5f22d143d7d8        10 seconds ago      107.5 MB

docker.io/nginx    latest             e4e6d42c70b3        2 daysago          107.5 MB

docker.io/centos   latest             36540f359ca3        8 daysago          192.5 MB

docker.io/alpine   latest             7328f6f8b418        2 weeksago         3.962 MB

 

启动自己做的镜像

docker run -d --name 自己起名字镜像的名字后面跟着执行的命令(默认没有执行的命令)

docker run -d --name lsy_nginx lsy/my_nginx:V1 nginx

[root@centos7 ~]# docker run -d --name lsy_nginxlsy/my_nginx:V1 nginx

[root@centos7 ~]# docker ps -a

CONTAINER ID       IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES

8624ad43cf1f       lsy/my_nginx:V1     "nginx"                  16 seconds ago      Exited (0) 15 seconds ago                            lsy_nginx

57f7e7bb9bb3       nginx               "nginx -g'daemon off"   23 minutes ago      Up 23 minutes                    80/tcp              mynginx

d4bbca6b4a94       centos              "bash"                   41 minutes ago      Up 41 minutes                                       amazing_knuth

2fa04440346b       centos             "bash"                  55 minutes ago      Exited (0) 43minutes ago                           awesome_jones

083631b830a7       centos             "bash"                  About an hour ago   Exited (130)About an hour ago                      berserk_montalcini

 

 

上传镜像

 

[root@centos7 ~]# docker search lsy0109lsy

INDEX      NAME                              DESCRIPTION   STARS    OFFICIAL   AUTOMATED

docker.io   docker.io/lsy0109lsy/lsy0109lsy  自己的镜像         0                   

 

[root@centos7 ~]# docker search lsy0109lsy/lsy0109lsy

INDEX      NAME                             DESCRIPTION   STARS     OFFICIAL  AUTOMATED

docker.io  docker.io/lsy0109lsy/lsy0109lsy   自己的镜像         0            

 

 

第一步

docker login

输入账号 密码

第二步:

docker p_w_picpaths

获取制作的镜像的ID

第三步:

docker tag 镜像的ID 后面跟自己在Docker Hub注册的账号的域名

第四步:

docker push后面跟自己在Docker Hub注册的账号的域名

这个时候就会上传你的镜像到网站

 

自己的操作过程记录

docker login

输入自己的账户和密码

docker p_w_picpaths

 

docker tag lsy/my_nginx:V1  docker.io/lsy0109lsy/my_nginx

 

docker push docker.io/lsy0109lsy/my_nginx

[root@centos7 ~]# docker pushdocker.io/lsy0109lsy/my_nginx

The push refers to a repository[docker.io/lsy0109lsy/my_nginx]

0cb915ddfd19: Layer already exists

473c450db44d: Layer already exists

57842ac5be45: Layer already exists

54522c622682: Layer already exists

latest: digest:sha256:0a07f792e691c9356fdbe01b31091ec5ef7fb92130b0cc0a06b7d15be8652965 size:1155

 

 

 

 

 

 

 

 

 

先执行把容器上传到镜像

docker commit -m "add new nginx dockerp_w_picpaths" my_nginx lsy/nginx:V1

 

查看镜像是否上传成功,并记录一下ID号下面访问的时候会用到

[root@docker1 ~]# docker p_w_picpaths

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

lsy/nginx           V1              f4a4e312ac8d        4 minutes ago       381.8 MB

docker.io/centos    latest              36540f359ca3        10 days ago         192.5 MB

docker.io/alpine    latest              7328f6f8b418        2 weeks ago         3.962 MB

 

在访问 镜像的nginx服务

docker run -p 80:80 --name nginx --rm f4a4e312ac8dnginx

 

打开网页看是否显示(输入主机的IP地址)

 

类别

Docker

Openstack

部署难度

非常简单

组件多,部署复杂

启动速度

秒级

分钟级

执行性能

和物理系统几乎一致

VM会占用一些资源

镜像体积

镜像是MB级别

虚拟机镜像GB级别

管理效率

管理简单

组件相互依赖,管理复杂

隔离性

隔离性高

彻底隔离

可管理性

单进程

完整的系统管理

网络连接

比较弱

借助Neutron可以灵活组件各类网络架构