Docker使用教程

  Docker是一个开源的引擎,能够轻松的为任何应用建立一个轻量级的、可移植的、自给自足的容器。让开发者能够打包他们的应用到一个可移植的容器中,而后发布到任何Linux机器上,还能够实现虚拟化。容器是彻底使用沙箱机制,相互之间不会有任何接口。html

1 Docker和虚拟机的区别 :linux

  • 容器是一种轻量级的基于操做系统级别的虚拟技术,不像虚拟机具备完整的CPU、内存和磁盘,是基于硬件的虚拟化技术。容器和宿主机共享内核,全部容器共享操做系统。nginx

  • 容器启动快 开源免费 轻量级虚拟化可以部署100-1000个容器docker


2 重要概念:vim

1)组件:
centos

  • docker镜像(Images):镜像运行以后成为容器,包含了应用程序和其运行时依赖环境的只读文件。bash

  • docker仓库:Registry是Docker镜像的中央存储仓库网络

  • docker容器:容器是独立运行的一个或一组应用。能够当作是一个简易版的Linux运行环境(能够理解为在沙盒中运行的进程)。tcp


3 安装ide

系统环境:CentOS 7.2

[zwj@localhost home]$ sudo yum -y install docker (CentOS6的安装:yum -y install docker-io)

[zwj@localhost home]$ sudo systemctl start docker.service

[zwj@localhost home]$ sudo systemctl status docker.service

[zwj@localhost home]$ sudo systemctl enable docker.service

[zwj@localhost system]$ docker -v

Docker version 1.12.6, build 1398f24/1.12.6


4 基本操做

经常使用命令:

搜索某个镜像:docker search name

获取某个镜像:docker pull name

查看镜像:docker p_w_picpaths

删除镜像:docker rmi name

启动容器:docker start 容器ID

中止容器:docker stop 容器ID

查看容器:docker ps -a

进入容器:docker exec 或 docker attach、nsenter,如:docker exec -it 6f48b7e16fe8 /bin/bash,建议使用nsenter命令进入

删除容器:docker rm 容器ID(须要先中止容器)

建立容器,退出时自动删除容器:docker run --rm centos /bin/echo "hehe"


4.1 镜像和容器

下载镜像:

[zwj@localhost system]$ sudo docker pull centos

查看本地镜像:        

[zwj@localhost ~]$ sudo docker p_w_picpaths             

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker.io/centos    latest              3bee3060bfc8        12 days ago         192.5 MB

使用centos镜像建立一个容器,并在容器中执行命令(若是本地没有镜像,会从公共仓库去下载):

[zwj@localhost ~]$ sudo docker run centos /bin/echo "hehe"   

hehe

查看当前全部容器,每一个容器有惟一的ID和名称:

[zwj@localhost ~]$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES

ba7ecb84d0e1        centos              "/bin/echo hehe"    5 minutes ago       Exited (0) 5 minutes ago                       silly_carson

建立一个name叫mydocker的容器,而且登录到容器:参数-t:表示为容器分配一个伪终端,-i:启动一个容器并进入交互模式,-d:后台运行

[zwj@localhost ~]$ sudo docker run --name mydocker -t -i centos /bin/bash

[root@6f48b7e16fe8 /]# 

退出容器后,容器处于退出状态

[root@6f48b7e16fe8 ~]# exit

exit

[zwj@localhost ~]$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES

6f48b7e16fe8        centos              "/bin/bash"         10 minutes ago      Exited (0) About a minute ago                       mydocker

ba7ecb84d0e1        centos              "/bin/echo hehe"    24 minutes ago      Exited (0) 23 minutes ago                           silly_carson

有什么办法在退出以后容器依然处于启动状态呢,步骤以下:

[zwj@localhost ~]$ sudo yum -y install util-linux

[zwj@localhost ~]$ sudo docker start 6f48b7e16fe8     #启动容器

6f48b7e16fe8

[zwj@localhost ~]$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES

6f48b7e16fe8        centos              "/bin/bash"         About an hour ago   Up About a minute                                  mydocker

ba7ecb84d0e1        centos              "/bin/echo hehe"    About an hour ago   Exited (0) About an hour ago                       silly_carson

[zwj@localhost ~]$ sudo docker inspect --format "``.`State`.`Pid`" 6f48b7e16fe8 #获取容器PID

3820

[zwj@localhost ~]$ sudo nsenter -t 3820 -u -i -n -p            #进入容器

[root@6f48b7e16fe8 zwj]# 

[root@6f48b7e16fe8 zwj]# exit            #退出后,容器依然处于启动状态

logout

[zwj@localhost ~]$ sudo docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES

6f48b7e16fe8        centos              "/bin/bash"         About an hour ago   Up 16 minutes                                      mydocker

ba7ecb84d0e1        centos              "/bin/echo hehe"    About an hour ago   Exited (0) About an hour ago                       silly_carson


4.2 网络和存储

建立并运行nginx容器,建立成功后会返回容器ID号,可是查看时一般是显示前几位而不是整个ID号。-d:后台运行,-P:默认匹配docker容器端口到宿主机随机端口。

[zwj@localhost system]$ sudo docker run -d -P nginx


06b751db90b24ca8750c6d25f0b424e72dba36d9261d0d09817c435ada5c0e68

由下面的输出能够看到,把本机的32768端口映射到了容器的80号端口。

[zwj@localhost system]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES

06b751db90b2        nginx               "nginx -g 'daemon off"   7 minutes ago       Up 7 minutes        0.0.0.0:32768->80/tcp   distracted_ride

6f48b7e16fe8        centos              "/bin/bash"              2 hours ago         Up About an hour                            mydocker

从客户端访问结果以下:

wKiom1lGUFvAnBlaAADjCKTrlEc376.png-wh_50

查看容器日志:

[zwj@localhost system]$ sudo docker logs 06b751db90b2

查看日志的实时输出:

[zwj@localhost system]$ sudo docker logs -f  06b751db90b2

也能够指定特定端口映射,注意docker run会另外建立一个容器

[zwj@localhost system]$ sudo docker run -d -p 88:80 nginx

f54ba5b475a04371ba84a2b193ff691d7545461e5f6d85309967fa0e86ca2b45

[zwj@localhost system]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES

f54ba5b475a0        nginx               "nginx -g 'daemon off"   11 seconds ago      Up 6 seconds        0.0.0.0:88->80/tcp      reverent_liskov

06b751db90b2        nginx               "nginx -g 'daemon off"   26 minutes ago      Up 26 minutes       0.0.0.0:32768->80/tcp   distracted_ride

6f48b7e16fe8        centos              "/bin/bash"              2 hours ago         Up About an hour                            mydocker


存储之数据卷:

使用-v参数建立数据卷而且挂载到容器,-v /data

[zwj@localhost system]$ sudo docker run -it --name volume-test1 -v /data centos

[root@834a476135d3 /]# ls -l /data

total 0

使用-v参数挂载本地目录至容器,-v src:dst

[zwj@localhost ~]$ sudo docker run -it --name test -v /opt:/opt centos

挂载并授予读写的权限,

[zwj@localhost ~]$ sudo docker run -it --name test -v /opt:/opt:rw centos

除了目录,还能够挂载文件。


存储之数据卷容器 --volumes-from:一般适应于一个容器访问另外一个容器,

建立一个容器取名nfs

[zwj@localhost ~]$ sudo docker run -d --name nfs -v /data centos

d65376b3a601dc338ad93cf2ab3ec163218e595cd36e4a4353f82e08b38b2670

建立另外一个容器test01,而且把nfs挂载到test01,能够看到test01根目录下有/data目录

[zwj@localhost ~]$ sudo docker run -it --name test01 --volumes-from nfs centos

[root@d38127cd879b /]# ls

anaconda-post.log  bin  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var


4.3 手动构建镜像 

下载基础镜像

[zwj@localhost system]$ sudo docker pull centos

建立容器,而且进入容器

[zwj@localhost ~]$ sudo docker run --name mynginx -it centos

在容器中安装epel源

[root@1418e12567d5 /]# rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

在容器中安装nginx

[root@1418e12567d5 /]# yum -y install nginx

而后建立新的镜像,

[zwj@localhost ~]$ sudo docker commit -m "my nginx" -a "zwj" 1418e12567d5  aa/a01:1.1

参数说明:

-m:提交的描述信息

-a:指定镜像做者

1418e12567d5:容器ID

aa/a01:指定要建立的镜像名


查看镜像,aa/a01镜像已存在

[zwj@localhost ~]$ sudo docker p_w_picpaths

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

aa/a01              1.1                 797ed1764943        33 seconds ago      367.9 MB

docker.io/centos    latest              3bee3060bfc8        12 days ago         192.5 MB

docker.io/nginx     latest              958a7ae9e569        2 weeks ago         109.4 MB

基于aa/a01镜像建立新的容器nginx01

[zwj@localhost ~]$ sudo docker run -it --name nginx01  aa/a01:1.1 

修改容器nginx01中nginx配置文件,使容器在后台运行时nginx可以运行 

[root@bd27b093bf3e /]# vi /etc/nginx/nginx.conf

daemon off;

user nginx;

基于上次修改,再次提交建立新的镜像

[zwj@localhost ~]$ sudo docker commit -m "my nginx" -a "zwj" bd27b093bf3e  aa/a01:1.2

[zwj@localhost ~]$ sudo docker p_w_picpaths

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

aa/a01              1.2                 42da08d9d427        2 minutes ago       367.9 MB

aa/a01              1.1                 797ed1764943        22 minutes ago      367.9 MB

docker.io/centos    latest              3bee3060bfc8        12 days ago         192.5 MB

docker.io/nginx     latest              958a7ae9e569        2 weeks ago         109.4 MB

基于新镜像建立容器,而且在容器中运行nginx命令

[zwj@localhost ~]$ sudo docker run -d -p 82:80 aa/a01:1.2 nginx

[zwj@localhost ~]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES

999ce7bd6559        aa/a01:1.2          "nginx"                  About a minute ago   Up About a minute   0.0.0.0:82->80/tcp   prickly_meninsky


4.4 Docker-file构建镜像:由一系列参数和命令构成的脚本,最终建立成新的镜像。

[zwj@www ~]$ sudo mkdir -pv dockerfile/nginx

mkdir: created directory ‘dockerfile’

mkdir: created directory ‘dockerfile/nginx’

[zwj@www ~]$ sudo tree dockerfile/

dockerfile/

└── nginx


1 directory, 0 files

[zwj@www ~]$ cd dockerfile/nginx/

[zwj@www nginx]$ sudo vim index.html

<h>Server 192.168.3.158</h>

#创建Dockerfile文件,其中#号表示注释

[zwj@www nginx]$ sudo vim Dockerfile

#This is Dockerfile

#Version:1.1

#Author:zwj


#Base p_w_picpath

FROM centos


#Author

MAINTAINER zwj 2962372861@qq.com


#Commands

RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm

RUN yum install -y nginx

ADD index.html /usr/share/nginx/html/index.html

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80

CMD ["nginx"]


#根据文件建立镜像,-t指定镜像名,后面是Dockerfile文件的绝对路径(目录的路径)

[zwj@www nginx]$ sudo docker build -t test/nginx:1.0 /home/zwj/dockerfile/nginx/

#查看建立的镜像

[zwj@www nginx]$ sudo docker p_w_picpaths

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

test/nginx          1.0                 86dcc8884006        46 seconds ago      400.8 MB

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

#如今可使用建立的镜像创建容器

[zwj@www nginx]$ sudo docker run -d -p 808:80 --name nginx test/nginx:1.0

[zwj@www nginx]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                 NAMES

6bf9453e4b71        test/nginx:1.0      "nginx"             38 seconds ago      Up 37 seconds       0.0.0.0:808->80/tcp   nginx


附:Dockerfile文件的命令介绍:

FROM:必须是Dockerfile的首个命令,用于定义镜像源

MAINTAINER:用于声明做者

ADD:从源文件系统复制文件到目标容器的文件系统 

CMD:描述容器启动后,执行的程序

ENTRYPOINT:配置一个容器使之可执行化,

ENV:用于设置环境变量,如:key=value

EXPOSE:用来指定端口

RUN:是Dockerfile执行命令的核心部分,它接受命令做为参数并用于建立的镜像

USER:设置容器的UID

VOLUME:用于让你的容器访问主机上的目录

WORKDIR:用于设置CMD指明的命令的运行目录


4.5 创建私有仓库

#下载registry镜像(用于创建私有仓库)

[zwj@www nginx]$ sudo docker pull registry

[zwj@www nginx]$ sudo docker p_w_picpaths

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

test/nginx           1.0                 86dcc8884006        39 minutes ago      400.8 MB

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

docker.io/registry   latest              c2a449c9f834        2 weeks ago         33.18 MB

#使用该镜像建立一个容器:默认状况下,会将仓库存放于容器内的/tmp/registry目录下

[zwj@www ~]$ sudo docker run -d -p 5000:5000 registry

b6b84915dbd24426c6cfae5737555f4a9e3f3ef2145ed6317f347ff99c1e119e

[zwj@www ~]$ sudo docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

b6b84915dbd2        registry            "/entrypoint.sh /etc/"   18 minutes ago      Up 18 minutes       0.0.0.0:5000->5000/tcp   lonely_heisenberg

#标记本地镜像:

[zwj@www ~]$ sudo docker tag test/nginx:1.0  120.77.148.249:5000/zwj/nginx:1.1

#把镜像推送至仓库:

[zwj@www ~]$ sudo docker push 120.77.148.249:5000/zwj/nginx:1.1


生产环境应用:

1)Docker Web管理工具:shipyard

2)规划

3)准备好基础镜像

相关文章
相关标签/搜索