docker
docker简介
虚拟化可以更高效的利用资源,更方便的管理服务,虚拟化技术重有主机级虚拟化,主机级别的虚拟化中有两种,有Type-I 和 Type-II 的虚拟化。
Type-I 的虚拟化是在硬件之上安装一个虚拟机管理器hypervisor,然后在hypervisor之上安装虚拟机。
Type-II 的虚拟化最常见的实际应用就是VMware workstation,Vitual box,还有kvm和zen。实现方法是在物理机器上安装一个主机操作系统,也叫宿主机,然后在宿主机上安装一个虚拟机管理器 Virtual Machine Monitor 简称VMM,然后在上面安装虚拟机。
计算机有内核空间和用户空间,真正产生价值的是用户空间的应用进程,而不是资源管理平台,但是没有内核没有库文件是没有办法运行程序。如一个虚拟机只需要运行一个nginx,但是却需要同时运行系统内核,在Type-II的虚拟化中要运行两个内核,这样的代价有点大,减少中间环节是提高效率的方式。
内核有一个功能提供环境隔离,如果抽调虚拟机内核的话就会使程序达不到隔离的效果;所以需要一个虚拟的环境隔离管理器来创建一个一个隔离的环境,隔离的就是用户空间,让需要隔离出来的进程跑在隔离的环境内,一个隔离出来的空间只跑一个或部分进程;其中有一个隔离出来的空间是有特权的,用来管理其他空间。这些被隔离出来的空间是被一个内核来统一管理的,进程所看到的边界是被隔离出来的边界。这个被隔离出来的空间就是容器,docker就是一种容器技术。
Docker有三部分组成:docker daemon,docker client,docker registries。
OCF开放容器格式,docker的官方容器站点:hub.docker.com ,docker是C/S架构的,服务端监听在套接字上,支持三种套接字,ipv4、ipv6、unix sockfile,阿里云有加速镜像,需要在阿里云开发者平台上注册账号。docker有社区版和企业版,docker-ce是社区版,docker-ee是企业版。
安装docker
安装docker的主机最好使用linux 3.1及以上版本的内核,CentOS7刚好符合要求。docker文档地址:http://docs.docker-cn.com/ 。
阿里云repo文件:
阿里镜像仓库:https://cr.console.aliyun.com
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
默认情况下extras仓库有docker,使用默认的docker使用 yum install docker 命令安装,但如果要使用如上下载的镜像则使用下面的命令。
yum install docker-ce
创建镜像加速:配置文件为 /etc/docker/daemon.json 这个文件默认不存在,需要手工创建。
mkdir /etc/docker vim /etc/docker/daemon.json { "registry-mirrors":["https://regisrty.docker-cn.com"] } 或 { "insecure-registries":["http://myharbor.com"] }
insecure-registries:非https的镜像地址
registry-mirrors:加速镜像地址
阿里云有镜像加速,需要注册账号,每个人都有属于自己的镜像加速地址。登陆后到 https://cr.console.aliyun.com 这个地址点击“镜像加速器”即可看到加速地址。
清华大学repo文件:
清华大学镜像加速:https://mirror.tuna.tsinghua.edu.cn
wget https://mirror.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo cd /etc/pki/rpm-gpg wget https://mirror.tuna.tsinghua.edu.cn/docker-ce/linux/centos/gpg #下载gpg文件
修改镜像地址:清华的镜像默认不是清华的地址,需要手工修改。
vim /etc/yum.repo/docker-ce.repo :%s@https://download.docker.com/linux@https://mirror.tuna.tsinghua.edu.cn/docker-ce/linux@
使用docker
启动docker:
systemctl start docker.service
新命令归类:
config
container 容器的操作
image 镜像的操作
network 网络的操作
node
plugin
secret
service
stack
swarm
system
trust
volume
常用docker命令:
docker version
docker info
docker search myname
docker inspect myname 查看某个docker容器信息
docker container:
docker container create --name myname nginx:latest
docker container ls
docker container ls -a
docker container ls --no-trunc
docker container logs myname
docker image:
docker image ls
docker image rm
docker network:
docker network ls
docker network rm network_name
docker network inspect network_name
启动进入或关闭容器:
docker run --name myname -it busybox:latest 启动并进入bash
docker run --name myname -d nginx:latest 启动容器
docker start myname
docker stop myname
docker kill myname
docker exec -it myname bash 容器运行时进入bash
docker exec -it myname /bin/sh
docker diff myname 查看修改后的镜像与之前的文件
制作镜像:
docker commit --author "qiyang" --message "say something" webtest nginx:v2
docker history nginx:v2 查看镜像的历史操作
docker build -t myname:1.1 ./ 创建自定义镜像 -t 名称:版本号
端口:
docker run --name web1 -d -p <宿主IP>:<宿主端口>:<容器端口> nginx:latest
docker run --name web1 -d -p <宿主端口>:<容器端口> nginx:latest
docker run --name web1 -d -p <容器端口> nginx:latest
docker run --name web1 -d -P nginx:latest
docker port web1
资源限制:
docker run --name nginx -d -m 100m --cpus=0.3 nginx:latest
--cpus=0.3 小数位百分比,整数为核心数,如--cpus=2 代表两核
挂载卷:
docker run --name db1 -d -v <宿主目录>:<容器目录> mysql:latest
docker run --name db1 -d -v <容器目录> mysql:latest
环境变量:
docker run --rm --name tomcat1 -e MYSQL_PASSWORD=123456 -d tomcat:v1
docker开机启动:
--restart=always
--restart=on-failure:10
--restart=no
--restart=unless-stopped
docker run --restart=always --name php7.2 -d -p 80:80 php7.2:0.2
如果服务已经启动且不能停止,可以更新命令使其开机启动服务:
docker update --restart=always <container_name>
以特权模式运行:
docker run --privileged=true php7.2:0.2
docker代理
方法一:文件名任意 xxx.conf,需要重启docker。
mkdir -p /etc/systemd/system/docker.service.d cat >> /etc/systemd/system/docker.service.d/proxy.conf <<EOF [Service] Environment="HTTP_PROXY=http://192.168.1.22:8118" Environment="HTTPS_PROXY=http://192.168.1.22:8118" Environment="NO_PROXY=localhost,127.0.0.1,192.168.1.0/24" EOF # 或者 sed -i '/ExecStart=/a\ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT' /usr/lib/systemd/system/docker.service sed -i "/ExecStart=/iEnvironment=HTTPS_PROXY=http://192.168.0.26:8118" /usr/lib/systemd/system/docker.service sed -i '/ExecStart=/i\Environment=NO_PROXY=127.0.0.0/8,192.168.0.0/24' /usr/lib/systemd/system/docker.service
方法二:重启容器即可。
vim ~/.docker/config.json { "proxies": { "default": { "httpProxy": "http://192.168.1.22:8118", "httpsProxy": "http://192.168.1.22:8118", "noProxy": "localhost,127.0.0.1,192.168.1.0/24" } } }
方法三:在构建镜像时使用。这种方法如果代理是localhost这样的地址需要加--network host 而且代理本身要开启 Gateway 模式。
docker build . \ --build-arg "HTTP_PROXY=http://192.168.1.22:8118" \ --build-arg "HTTPS_PROXY=http://192.168.1.22:8118" \ --build-arg "NO_PROXY=localhost,127.0.0.1,192.168.1.0/24" \ -t your/image:tag