学习Docker(一)

一、docker介绍

docker是半虚拟化,比完全虚拟化性能高,可以使用物理机性能100%

Docker 镜像(Images):  用于创建 Docker 容器的模板
Docker 容器(Container): 独立运行的一个或一组应用
Docker 客户端(Client):  客户端通过命令或 Docker API 与 Docker 的守护进程通信
Docker 主机(Host): 一个物理或者虚拟的机器,用于执行 Docker 守护进程和容器
Docker 仓库(Registry): 仓库用来保存镜像,可以理解为代码控制中的代码仓库
Docker Machine Docker: 一个简化Docker安装的命令工具
Docker项目的目标: 实现轻量级的操作系统虚拟化解决方案
Docker的基础: linux容器(LXC)等技术

 二、安装

1、centos 6 安装
yum源:https://mirrors.ustc.edu.cn/epel/6/x86_64/
yum install -y docker-io
/etc/init.d/docker start

2、centos 7 安装
yum源:https://mirrors.ustc.edu.cn/epel/7/x86_64/
yum -y install docker
systemctl start docker

三、镜像管理

1、搜索镜像

docker search centos

2、获取镜像

docker pull  centos

3、查看镜像

docker images

4、删除镜像

docker rmi  centos
docker rmi  镜像名或ID  -f 强制删除

5、导出镜像

docker save centos > /opt/centos.tar.gz
docker save -o /opt/centos.tar.gz  centos:6

6、导入镜像

docker load < /opt/centos.tar.gz
docker load --input  /opt/centos.tar.gz

7、镜像打标签

docker tag nginx nginx_1.12.2                     #打标签
docker tag nginx_1.12.2:latest  nginx:latest #修改标签

四、容器管理

1、启动Docker容器

docker run --name mydocker -itd centos /bin/bashdocker start  12(id)                          #前二位数就可以

2、查看容器

docker ps -a
docker ps -a -q                                #列出所有启动容器的ID
docker inspect #查看容器的详细信息(JSON格式)
docker inspect -f {{".Architecture"}} nginx #-f 指定某一项

3、停止容器

docker stop 961fd1162c2f
docker kill 23sdjlf33331

4、删除容器

docker rm    c599b569f387                     #删除已经停止的容器
docker rm -f 302f39c202c9                     #强制删除运行或停止的容器
docker rm $(docker ps -a -q) #删除所有停止的容器

5、进入容器

1、attach命令
docker attach 867e6627a194                    #当多个窗口同时用attach,操作同一个容器时,所有窗口会同步显示,当某个窗口阻塞时,其他窗口也无法操作

2、exec命令(推荐方式) docker exec -it mynginx /bin/bash
3、nsenter工具 yum install -y util-linux #安装nsenter工具 docker inspect --format "{{.State.Pid}}" 5d2k9d #获取PID nsenter -t 4851 -m -u -i -n -p
脚本:
#!/bin/bash
PID=`docker inspect --format "{{.State.Pid}}" $1`
nsenter -t $PID -u -i -n -p

6、导出容器

docker export 84acb55af1f9 > centos.tar.gz

7、导入容器

cat /tmp/centos.tar |docker import - centos:6

五、docker的基础命令

# docker -h
--config string            #客户端配置文件的位置
-D, --debug               #启用Debug调试模式
--help                    #查看帮助信息
-H, --host list              #守护进程的套接字(Socket)连接
-l, --log-level string       #设置日志级别
-v, --version                #打印版本信息并退出
Commands:
  attach                      #进入一个正在运行的容器
  build                 #通过Dockerfile创建镜像
  commit                      #提交当前容器为一个新的镜像
  cp                          #从容器中拷贝指定文件或者目录到宿主机中
  create                      #创建一个新的容器
  diff#查看docker容器变化
  events                      #从docker服务获取容器实时事件
  exec                        #在一个已经运行的容器中运行一条命令
  export                      #导出容器的内容流作为一个tar归档文件
  history                     #展示一个镜像形成历史
  images                      #列出系统当前镜像
  import                      #导入一个镜像
  info                        #显示系统信息
  inspect                     #查看容器详细信息
  kill                        #kill指定docker容器
  load                        #从一个tar包中加载一个镜像(对应save)
  login                       #注册或者登陆一个docker源服务器
  logout                      #从当前Docker registry退出
  logs                        #输出当前容器日志信息
  pause                       #暂停容器
  port                        #查看映射端口对应的容器内部源端口
  ps                          #列出容器列表
  pull                        #从docker镜像源服务器拉取指定镜像或者库镜像
  push                        #推送指定镜像或者库镜像至docker源服务器
  rename                      #重命名容器
  restart                     #重启运行的容器
  rm                          #移除一个或者多个容器
  rmi                         #移除一个或者多个镜像
  run                         #创建一个新的容器并运行一个命令
  save                        #保存一个镜像为一个tar包(对应load)
  search                      #在docker hub中搜索镜像
  start                       #启动容器
  stats                       #统计容器使用资源
  stop                        #停止容器
  tag                         #给源中镜像打标签
  top                         #查看容器中运行的进程信息
  unpause                     #取消暂停容器
  update                      #更新一个或多个容器的配置信息
  version                     #查看容器版本号
  wait                        #截取容器停止时的退出状态值

 六、端口映射

1、映射所有接口地址
docker run -d -p 5000:5000 centos_nginx bash
docker run -d -p 5000:5000 -p 8082:80 centos_nginx bash

2、映射到指定地址的指定端口
docker run -d -p 127.0.0.1:5000:5000 centos_nginx bash

3、映射到指定地址的任意端口
docker run -d -p 127.0.1.1::5000 centos_nginx bash

4、查看端口映射情况
docker port container_name/container_id

 七、数据管理

 容器中管理数据主要有两种方式:

1)数据卷(Data Volumes)
2)数据卷容器(Data Volumes Dontainers)

1、数据卷

docker run -itd  --name web2 -v /data:/data centos  
-v 指定挂载目录,前面的/data/为本地目录,后面的/data/为容器里的目录,会在容器中自动创建

2、数据卷容器

1、创建一个数据卷dbdata容器
docker run -it -v /dbdata --name dbdata centos

2、创建容器,挂载dbdata数据卷到容器中 docker run -it --volumes-from dbdata --name db1 centos
3多个容器挂载多个数据卷 docker run -itd --name db5 --volumes-from db1 --volumes-from db4 centos
4、从其他的容器(已挂载容器卷),挂载容器卷 docker run -it --name db2 --volumes-from db1 centos
5、备注
挂载数据卷的容器,不用运行,删除了挂载的容器,数据卷不会删除,若要删除容器和数据卷,用docker rm -v命令

3、利用数据卷容器迁移数据

1、备份
docker run --volumes-from dbdata -v /backup:/backup --name work centos tar cvf /backup/backup.tar /dbdata
创建一个容器,挂载数据卷,并将本地目录挂载到容器里,使用tar 压缩备份

2、恢复
docker run -itd -v /dbdata --name db6 centos bash
docker run --volumes-from db6 -v /backup:/backup --name db7 centos tar xvf /backup/backup.tar 
新建一个容器,挂载数据卷,并将本地的目录挂载容器里,使用tar 解压恢复

八、镜像制作

1、手动构建

1、启动centos容器
docker run -itd  --name mynginx centos

2、进入容器并安装nginx docker exec -it mynginx bash yum -y install wget gcc gcc-c++ make openssl-devel pcre-devel wget http://nginx.org/download/nginx-1.10.2.tar.gz useradd -s /sbin/nologin -M www tar xf nginx-1.10.2.tar.gz cd nginx-1.10.2 ./configure --prefix=/usr/local/nginx --user=www --group=www make && make install echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf 3、创建镜像 docker commit -m "my nginx" 335573f3663c wuhg/mynginx:v1 -m: 描述 wuhg: dockerhub的用户名 mynginx: 制作后的镜像名 v1: 版本号 4、启动镜像 docker run -d -p 91:80 wuhg/mynginx:v1 /usr/local/nginx/sbin/nginx 启动容器并启动nginx

2、自动构建

1)编辑dockerfile文件

# vim Dockerfile
  FROM centos
  MAINTAINER  wuhg
  RUN yum install -y wget gcc gcc-c++ make openssl-devel pcre-devel
  ADD http://nginx.org/download/nginx-1.12.2.tar.gz 
  RUN tar zxvf nginx-1.12.2.tar.gz
  RUN useradd -s /sbin/nologin -M www
  RUN cd nginx-1.12.2 && ./configure --prefix=/usr/local/nginx --user=www --group=www && make && make install
  RUN rm -fv /usr/local/nginx/conf/nginx.conf
  ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
  RUN echo "mynginx" > /usr/local/nginx/html/index.html
  RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
  EXPOSE 80
  ENTRYPOINT /usr/local/nginx/sbin/nginx

2)创建镜像

# docker build -t wuhg/mynginx:v2 /tmp/

3)查看创建的镜像,并启动

# docker images
# docker run -itd -p 92:80 wuhg/mynginx:v2 bash

备注:
# docker run -e myname=tom centos #-e 设置变量

Dockerfile指令

FROM:              基础镜像
MAINTAINER:        维护者
RUN:               执行命令
ADD:               添加文件,自动解压
workdir:           当前工作目录(类似cd)
volume :           目录挂载
EXPOSE:            打开的端口
CMD:                指定启动容器时,默认执行的命令
ENV                 指定一个环境变量(如: MySql)
COPY                复制文件或目录
ENTRYPOINT          指定镜像的默认入口命令
USER                运行容器时的用户名
WORKDIR             ENTRYPOINT指令配置工作目录
ARG                 指定镜像内使用的参数
SHELL               指定使用shell的默认类型

 

九、资源限制和隔离

容器资源分配

1)安装stress压力测试
# vim Dockerfile
  FROM centos:6
  ADD epel.repo  /etc/repos.d/
  RUN  yum -y install stress
  ENTRYPOINT ["stress"]

epel源:https://mirrors.aliyun.com/epel/6/x86_64/
# docker build -t stress:V1 /root/

2)CPU资源控制
docker run -itd --cpu-shares 100 stress:V1 --cpu 1     #--cpu-shares默认1024,--cpu 1是stress压力测试参数
docker run -itd --cpuset-cpus 0-2 stress:V1            #创建的容器只能使用012这三个核心
cat /cgroup/cpuset/docker/CONTAINTER_ID/cpuset.cpus
docker exec CONTAINER_ID taskset -c -p1                #查看容器内进程与cpu的绑定,容器内第一个进程的编号一般为1

3)内存资源控制
docker run -itd -m 128m stress:V1 --vm 1 --vm-bytes 128m --vm-hang 0 #-m设置容器使用最大物理内存,不含swap,--vm是压力测试参数
cat /cgroup/memory/docker/CONTAINER_ID/memory.limit_in_bytes
cat /cgroup/memory/docker/CONTAINER_ID/memory.memsw.limit_in_bytes

十、私有仓库

 创建和使用私有仓库

1、自动下载registry镜像并启动容器,创建本地私有仓库。
docker run -d -p 5000:5000 registry

2、默认仓库创建的容器在/tmp/registry或/var/lib/registry
docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

3、上传到私有仓库
docker tag nginx:v1 192.168.4.10:5000/nginx     #必须带有私有仓库的ip:port
docker push 192.168.4.10:5000/nginx             #上传到私有仓库

http上传方式:
# vim /etc/sysconfig/docker
  other_args="--insecure-registry 192.168.4.10:5000"
# /etc/init.d/docker restart

4、下载
# vim /etc/sysconfig/docker
  other_args="--insecure-registry 192.168.4.10:5000"
# /etc/init.d/docker restart
# curl http://192.168.4.10:5000/v2/_catalog
# docker pull 192.168.4.10:5000/nginx

十一、web管理软件shipyard

搭建过程( v2版):

1、修改docker监听ip和端口
# vim /etc/sysconfig/docker
  other_args="-H tcp://0.0.0.0:235 -H unix:///var/run/docker.sock"
# /etc/init.d/docker restart

2、启动rethinkdb
1)获取一个/data的数据卷
docker run -itd --name shipyard-rethinkdb-data  --entrypoint /bin/bash shipyard/rethinkdb -l
2)使用数据卷/data启动RethinkDB
docker run -itd -P  --name shipyard-rethinkdb  --volumes-from shipyard-rethinkdb-data shipyard/rethinkdb

3、启动shipyard控制器
docker run -itd -p 8080:8080  --name shipyard   --link shipyard-rethinkdb:rethinkdb shipyard/shipyard

4、测试
通过浏览器访问http://192.168.4.10:8080
默认用户名/密码为 admin/shipyard

5、启动和停止顺序
docker stop  shipyard shipyard-rethinkdb shipyard-rethinkdb-data
docker start shipyard-rethinkdb-data shipyard-rethinkdb shipyard
启动两个镜像(获取/data数据卷,使用数据卷/data启动rethinkdb),最后启动shipyard控制器

v3版本

curl -sSL https://shipyard-project.com/deploy | bash -s  (一键安装)   

十二、docker网络

1、查看docker网络
docker network ls

2、网络驱动
bridge:        NAT模式,默认模式
host :         复制物理机网卡
none :         不会配置网络(要自定义配置)

3、案例
docker run -it  --net=host -p 80:80 centos bash
docker run -itd --net=none --name=ng1 nginx

4、自定义docker网络(用脚本执行,删除ip地址,ssh连接不上)
ip link set docker0 down                            #禁用网桥docker0
brctl delbr docker0                                 #删除网桥docker0
brctl addbr br0                                     #添加网桥br0
ip addr add 192.168.4.2/24 dev br0                  #br0网卡添加ip地址
ip addr del 192.168.4.2/24 dev eth0                 #eth0网卡删除ip地址(
brctl addif br0 eth0                                #网桥br0绑定eth0
ip link set br0 up                                  #启用网桥br0
route add default gw 192.168.4.254                  #添加网关

 十三、使用 Supervisor 来管理进程

# vim supervisord.conf
  [supervisord]
  nodaemon=true
  [program:nginx]
  command=/usr/sbin/nginx
  [program:php-fpm]
  command=/usr/sbin/php-fpm
  [program:mysql]
  command=/usr/bin/mysqld_safe

                                                                                       

原文地址:https://www.cnblogs.com/wuhg/p/10407768.html