设为首页 收藏本站
查看: 993|回复: 0

[经验分享] Docker使用教程

[复制链接]

尚未签到

发表于 2018-5-27 13:56:46 | 显示全部楼层 |阅读模式
  Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。让开发者可以打包他们的应用到一个可移植的容器中,然后发布到任何Linux机器上,还可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
  1 Docker和虚拟机的区别 :

  •   容器是一种轻量级的基于操作系统级别的虚拟技术,不像虚拟机具有完整的CPU、内存和磁盘,是基于硬件的虚拟化技术。容器和宿主机共享内核,所有容器共享操作系统。
  •   容器启动快 开源免费 轻量级虚拟化能够部署100-1000个容器
      

  2 重要概念:
  1)组件:


  •   docker镜像(Images):镜像运行之后成为容器,包含了应用程序和其运行时依赖环境的只读文件。
  •   docker仓库:Registry是Docker镜像的中央存储仓库
  •   docker容器:容器是独立运行的一个或一组应用。可以看成是一个简易版的Linux运行环境(可以理解为在沙盒中运行的进程)。
  

  3 安装
  系统环境: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 images
  删除镜像: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 images
  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
  从客户端访问结果如下:
DSC0000.png

  查看容器日志:

  [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 images
  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 images
  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 image
  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 images
  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 images
  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)准备好基础镜像

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-481848-1-1.html 上篇帖子: 【Docker镜像】docker默认存放路径 下篇帖子: docker 仓库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表