一、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

学习Docker(一)的更多相关文章

  1. 从零开始学习 Docker

      这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的 ...

  2. 如何学习Docker

    如何学习Docker 学习Docker,如果没有云计算的基本知识,以及内核的基本知识,那么学习并理解起来会稍吃力.作为容器,Docker容器的优势在哪,不足在哪,最好了解容器的实现是怎样的(简单了解) ...

  3. 系统学习Docker 践行DevOps理念

    Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...

  4. 从零开始学习docker之在docker中搭建redis(集群)

    docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...

  5. Docket学习--Docker入门

    什么是Docker? Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...

  6. 学习docker

    虚拟机下Ubuntu环境 1.sudo apt-get update 2.sudo apt-get install docker.io 3.在daocloud(http://www.daocloud. ...

  7. 学习docker可能会用到的参考

    局域网部署Docker--从无到有创建自己的Docker私有仓库 http://lib.csdn.net/base/docker 正在刷(学习)一遍官方文档,上面是一些其他可能用到的资料,是在解决自己 ...

  8. 3W法则-学习Docker

    一.前言       5W1H法则是在一次面试中学习到的,后来在工作也开始使用这种东西,虽然最后没去那家公司,但是也是学习到了,关注开这些东西以后,也发现了一些简化版的3W法则,最近公司也要搞Doce ...

  9. 1.ASP.NET Core Docker学习-Docker介绍与目录

    Docker的优点: 1节约时间,快速部署和启动 2节约成本 3标准化应用发布 4方便做持续集成 5可以用Docker做为集群中的轻量主机或节点 6方便构建基于SOA或者微服务架构 的系统 学习目录: ...

  10. Docker学习のDocker初识

    一.Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...

随机推荐

  1. 如何利用Smartbi做数据分析:车企销量排名TOP10的车型

    下面我们来对比一下去年和今年的销量.同比增长情况: 图1. 轿车销量月趋势 图2. SUV销量月趋势 不难看出2月.7月为两个销量低点,而7月销量受天气影响较大,烈日.高温,毫无看车热情,复杂多变的外 ...

  2. Django中的Session和cookie

    Session和cookie 参考文献:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.问题引入 1.1 cookie是什么? 保存在客 ...

  3. docker 搭建php 开发环境 添加扩展redis、swoole、xdebug

    docker-compose搭建lnmp 先决条件 首先需要安装docker 安装docker-compost 1.创建lnmp工作目录 #创建三个目录 mkdir lnmp && c ...

  4. Lua中如何实现类似gdb的断点调试--02通用变量打印

    在前一篇01最小实现中,我们实现了Lua断点调试的的一个最小实现.我们编写了一个模块,提供了两个基本的接口:设置断点和删除断点. 虽然我们已经支持在断点进行变量的打印,但是需要自己指定层数以及变量索引 ...

  5. Phoenix使用

    目录 Phoenix连接 Phoenix常用命令 表映射 视图映射 表映射 Phoenix二级索引 开启索引支持 全局索引 创建索引后 创建多条件索引后 本地索引 覆盖索引 总结 Phoenix JD ...

  6. spring框架中Bean的生命周期

    一.Bean 的完整生命周期 在传统的Java应用中,bean的生命周期很简单,使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了.一旦bean不再被使用,则由Java自 ...

  7. JQ,JQuery的ajax卡住了,浏览器页面卡住

    在使用ajax的时候浏览器卡住了, 经过测试是因为在ajax中使用的data数据变量写错了 不存在也不报错,直接卡主了 好好检查一下吧.

  8. S5700上三层Vlan间隔离的例子

    转自:https://forum.huawei.com/enterprise/zh/forum.php?mod=viewthread&tid=247591 公司最近的无线覆盖做好了,但让人无语 ...

  9. Linux开机自启应用&开机执行脚本&监听端口应用挂掉了执行启动脚本

    linux开机自启 背景 目前要部署一个spring boot框架的jar包,实现开机启动项目或者应用挂掉了 执行启动脚本 在root目录下有一个启动项目的脚本: app_start.sh app_s ...

  10. 『现学现忘』Docker基础 — 24、Docker图形化管理工具Portainer

    目录 1.Portainer介绍 2.Portainer安装启动 3.Portainer初始化配置 4.Portainer汉化 1.Portainer介绍 (1)Portainer 是一款轻量级的图形 ...