学习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
学习Docker(一)的更多相关文章
- 从零开始学习 Docker
这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的 ...
- 如何学习Docker
如何学习Docker 学习Docker,如果没有云计算的基本知识,以及内核的基本知识,那么学习并理解起来会稍吃力.作为容器,Docker容器的优势在哪,不足在哪,最好了解容器的实现是怎样的(简单了解) ...
- 系统学习Docker 践行DevOps理念
Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...
- 从零开始学习docker之在docker中搭建redis(集群)
docker搭建redis集群 docker-compose是以多容器的方式启动,非常适合用来启动集群 一.环境准备 云环境:CentOS 7.6 64位 二.安装docker-compose #需要 ...
- Docket学习--Docker入门
什么是Docker? Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机). ...
- 学习docker
虚拟机下Ubuntu环境 1.sudo apt-get update 2.sudo apt-get install docker.io 3.在daocloud(http://www.daocloud. ...
- 学习docker可能会用到的参考
局域网部署Docker--从无到有创建自己的Docker私有仓库 http://lib.csdn.net/base/docker 正在刷(学习)一遍官方文档,上面是一些其他可能用到的资料,是在解决自己 ...
- 3W法则-学习Docker
一.前言 5W1H法则是在一次面试中学习到的,后来在工作也开始使用这种东西,虽然最后没去那家公司,但是也是学习到了,关注开这些东西以后,也发现了一些简化版的3W法则,最近公司也要搞Doce ...
- 1.ASP.NET Core Docker学习-Docker介绍与目录
Docker的优点: 1节约时间,快速部署和启动 2节约成本 3标准化应用发布 4方便做持续集成 5可以用Docker做为集群中的轻量主机或节点 6方便构建基于SOA或者微服务架构 的系统 学习目录: ...
- Docker学习のDocker初识
一.Docker是什么 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然 ...
随机推荐
- 由浅入深--MyBatis系列
从今天开始将要开始由浅入深--MyBatis系列博客的编写; 主要目录如下: MyBatis基础知识篇 1.由浅入深---ORM简介 2.由浅入深---MyBatis的整体架构 3.由浅入深---第一 ...
- windows系统如何远程桌面连接
转至:https://jingyan.baidu.com/article/67662997adb46a54d51b84bd.html 远程桌面连接是一种通过网络技术,远程操作另一台电脑的过程,随着wi ...
- POJ2663,3420题解
两道非常像的题,放到一起来写 题目大意:用若干2x1的砖去铺一个3xN的空间(POJ3420为4xN),问总共有多少种不同的铺法(POJ3420还要求结果对MOD求模). 思路:找规律.对于3xN的空 ...
- oracel数据库ORA-28001: the password has expired
调试c#项目时登录用户不成功ORA-28001: the password has expired错误 密码过期失效 网上查了一下,是Oracle11g密码过期的原因 Oracle提示错误消息ORA- ...
- C# 爬取图片
网络收集整理 爬取图片 引用AngleSharp NuGet 包 using AngleSharp; using System; using System.Collections.Generic; ...
- Typora笔记上传到博客
Typora笔记上传到博客 Markdown是一种轻量级标记语言,排版语法简洁,让人们更多地关注内容本身而非排版.它使用易读易写的纯文本格式编写文档,可与HTML混编,可导出 HTML.PDF 以及本 ...
- 二级python考试大纲以及考试指导复习方案
二级python考试大纲与复习指导 本人也是在备考二级py 可能理解不对的地方请指正 参考网络,侵权删除 考纲解读→ 一.考试介绍 1.1考试人群 全国计算机等级考试(python语言程序设计(二 ...
- 【NLP】
- Java入土---Java运行机制及IDEA的安装使用
Java运行机制及IDEA的安装使用 java程序运行机制 计算机高级语言分为编译型语言跟解释型语言,而java同时具有两者的特点. 可能对于新手来说,什么是编译,什么是解释; 简单来说,编译就是将代 ...
- CentOS 7.5关闭FireWall 和SELinux图文详解
CentOS 7.5关闭FireWall 和SELinux图文详解 1. 环境 CentOS 7.5 2. 关闭FireWall和SELinux 2.1 FireWall 使用systemctl st ...