Docker常用命令
查看docker版本
1 | docker --version |
docker常用命令
1 | docker search <image> |
运行nginx服务器
1 | docker run -d -p 80:80 --name webserver nginx |
停止服务器
1 | docker stop webserver |
删除服务器
1 | docker rm webserver |
docker命令
Docker简介
依赖于linux的cgroups和namespace
1 | docker run -i -t ubuntu /bin/bash |
Docker的基本组成
Docker Client/Docker Daemon
C/S架构
本地/远程
Docker Image
容器的基石(源代码)
层叠的只读文件系统
联合加载(union mount)
— 可写层
— add Apache
— add emacs
— rootfs(Ubuntu) <————基础镜像
— bootfs
Docker Container
通过镜像启动
启动和执行阶段
写时复用(copy on write)
Docker Registry
公有和私有
从DockerHub上下载
常用命令
1 | docker version |
Docker容器相关技术简介
Namespaces命令空间
系统资源的隔离(包括进程、网络、文件系统)
(1)PID(Process ID) 进程隔离
(2)NET(Network) 管理网络隔离
(3)IPC 管理跨进程通信的访问
(4)MNT(Mount) 管理挂载点
(5)UTS(Unix Timesharing System) 隔离内核和版本标识
Cgroups 控制组
用来分配资源
来源于Google
(1)资源限制
(2)优先级限制
(3)资源计量
(4)资源控制
Docker容器的能力
(1)文件系统的隔离:每个容器都有自己的root文件系统
(2)进程隔离:每个容器都运行在自己的进程环境中
(3)网络隔离:容器间的虚拟网络接口和IP地址都是分开的
(4)资源隔离和分组:使用cgroup将cpu和内存之类的资源独立分配给每个Docker容器
Docker在Ubuntu中的安装
检查内核版本
1 | uname -a |
检查Device Mapper
1 | ls -l /sys/class/misc/device-mapper |
(1)ubuntu维护的docker版本安装
1 | sudo apt-get install -y docker.io |
(2)安装Docker维护的版本
1 | sudo apt-get install -y curl |
使用非root用户
1 | sudo groupadd docker |
Docker的客户端和守护进程
Remote API
Restful风格API
STDIN、STDOUT、STDERROR
Docker官方的Remote API Reference:
https://docs.docker.com/reference/api/docker_remote_api/
连接方式(Socket连接)
1 | unix:///var/run/docker.sock(默认的连接方式) |
1 | ps -ef | grep docker |
Remote API example:
1 | nc -U /var/run/docker/docker.sock |
Docker的远程访问
修改docker配置(vim /etc/default/docker)
1 | sudo service docker restart |
客户端的远程访问
1 | curl http://10.211.55.5:2375/info |
Docker_HOST环境变量
Docker守护进程的配置和操作
1 | ps -ef | grep docker |
以守护的形式运行docker
docker -d [OPTIONS]
运行相关:
-D,–debug=false
-e,–exec-driver=”native”
-g,–graph=”/var/lib/docker”
–icc=true
-l,–log-level=”info”
–label=[]
-p,–pidfile=”/var/run/docker.pid”
Docker服务器连接相关:
-G,–group=”docker”
-H,–host=[]
–tls=false
–tlscacert=”/home/sven/.docker/ca.pem”
–tlscert=”/home/sven/.docker/cert.pem”
–tlskey=”/home/sven/.docker/key.pem”
–tlsverify=false
RemoteAPI相关:
–api-enable-cors=false
存储相关:
-s,–storage-driver=””
–selinux-enabled=false
–storage-opt=[]
Registry相关:
–insecure-registry=[]
–registry-mirror=[]
网络设置相关:
-b,–bridge=””
–bip=””
–fixed-cidr=””
–fixed-cidr-v6=””
–dns=[]
–dns-search=[]
–ip=0.0.0.0
–ip-forward=true
–ip-masq=true
–iptables=true
–ipv6=false
–mtu=0
Docker Command Line Reference:
https://docs.docker.com/reference/commandline/cli
启动配置文件
/etc/default/docker
DOCKER_OPTS =
容器的基本操作
启动容器:
1 | docker run image [command] [arg] |
启动交互式容器:
1 | docker run -i -t image /bin/bash |
-i –interactive=true|false 默认是false
-t –tty=true|false 默认是false
查看容器
-a 列出所有的容器 -l列出最新创建的容器
1 | docker ps [-a] [-l] |
查看运行的容器
1 | docker ps |
查看所有的容器
1 | docker ps -a |
查看最近运行的容器
1 | docker ps -l |
Docker自定义容器名
1 | docker run --name=test -i -t ubuntu /bin/bash |
重新启动已经停止的容器:
1 | docker start [-i] 容器名 |
删除已经停止的容器
1 | docker rm containerId |
Docker守护式容器
1 | docker run -i -t image /bin/bash |
Ctrl+P Ctrl+Q
重新进入容器
1 | docker attach containerId |
启动守护式容器
1 | docker run --name dc1 -d ubuntu /bin/sh "while true;do echo hello world; sleep 1;done" |
容器日志:
docker logs [-f] [-t] [–tail] 容器名
-f –follows=true|false 默认为false
-t –timestamps=true|false 默认为false
–tail=”all”
查看容器内的进程:
1 | docker top containerId or containerName |
在运行的容器内启动新进程
1 | docker exec [-d] [-i] [-t] 容器名 [command] [arg...] 785d8f10f6ad |
停止守护式容器
发送信号,等待容器停止
1 | docker stop 容器名 |
直接停止容器
1 | docker kill 容器名 |
在容器中部署静态网站
设置容器的端口映射
run [-P] [-p]
-P,–publish-all=true|false 默认为false 暴露所有的端口
docker run -P -i -t ubuntu /bin/bash
-p,–publish=[]
containerPort
docker run -p 80 -i -t ubunbu /bin/bash
hostPort:containerPort
docker run -p 8080:80 -i -t ubuntu /bin/bash
ip:containerPort
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
ip:hostPort:containerPort
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
Nginx部署流程
1.创建映射80端口的交互式容器
1 | docker run -p 80 --name web -i -t ubuntu /bin/bash |
2.安装Nginx
1 | apt-get install -y nginx |
3.安装文本编辑器vim
1 | apt-get install -y vim |
4.创建静态页面
1 | mkdir -p /var/www/html |
5.修改nginx配置文件
1 | whereis nginx |
6.运行nginx
1 | nginx |
7.验证网站访问
查看端口的映射情况
1 | docker port web |
80/tcp -> 0.0.0.0:49167
查看容器中进程的运行情况
1 | docker top web |
查看容器的ip地址
1 | docker inspect web |
查看和删除镜像
1 | docker info |
docker images:
-a,–all=false
-f,–filter=[]
–no-trunc=false 指定不使用截断的形式
-q,–quiet=false 只显示镜像的唯一id
1 | docker inspect container/image |
-f,–force=false Force removal of the image
–no-prune=false Do not delete untagged parents
删除所有的镜像
1 | docker rmi $(docker images -q) |
构建镜像
保存对容器的修改,再次使用
自定义镜像的能力
以软件的形式打包并分发服务及其运行环境
docker commit 通过容器构建
docker build 通过dockefile文件构建镜像
docker commit [OPTIONS] containner[repository[:TAG]]
-a,–author=”” Author
eg “xxx@xxx.com“
-m,–message=”” commit message
-p,–pause=true Pause container during commit
eg:
(1)docker run -it -p 80 –name commit_test ubuntu /bin/bash
(2)apt-get nginx
(3)docker commit commit_test -a “test” -m “test” dormancypress/commit_test1
(4)docker images
(5)docker run -d –name nginx_web1 -p 80 dormancypress/commit_test1 nginx -g “daemon off;”
创建dockerfile
##First Dockerfile
FROM ubuntu:14.04
MAINTAINER dormancypress “xxx@xxx.com“
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
mkdir -p dockerfile/df_test1
cd dockerfile/df_test1
vim Dockerfile
docker build [OPTIONS] PATH | URL | -
–force-rm=false
–no-cache=false
–pull=false
-q,–quiet=false
–rm=true
-t,–tag=””
docker build -t=’dormancypress/df_test1’ .
获取和推送镜像
查找镜像
Docker Hub:
https://registry.hub.docker.com
docker search [OPTIONS] TERM
–automated=false Only show automated builds
–no-trunc=false Don’t truncate output
-s,–stars=0 Only displays with at least X stars
拉取鏡像
docker pull
使用–registry-mirror选项加速下载
(1)修改:/etc/default/docker
(2)添加:DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR“
vim /etc/default/docker
DOCKER_OPTS = “–registry-mirror=http://MIRROR_ADDR“
sudo service docker restart
ps -ef | grep docker
docker push dormancypress/nginx
Docker指令
指令格式
(1)# Comment 注释
(2)INSTRUCTION argument 指令
基础镜像,必须是dockerfile中第一条指令
FROM
FROM
制定镜像的作者信息, 包含镜像的所有者和联系信息
MAINTAINER
指定当前镜像中运行的命令(构建时运行)
RUN
/bin/sh -c command
RUN echo hello
RUN [“executable”,”param1”,”param2”] (exec模式)
RUN[“/bin/bash”,”-c”,”echo hello”]
指定运行该镜像的容器使用的端口
EXPOSE
CMD(运行时运行)(会被docker run中指定的启动命令覆盖)
CMD“executable”,”param1”,”param2”
CMD command param1 param2 (shell模式)
CMD[“param1”,”param2”] (作为ENTRYPOINT指令的默认参数)
不会被docker run中指定的启动命令覆盖(可以使用docker run –entrypoint覆盖)
ENTRYPOINT“executable”,”param1”,”param2”
ENTRYPOINT command param1 param2(shell模式)
CMD和ENTRYPOINT组合使用
docker run -p 80 -d –name ep_test2 dormancypress/df_test5 -g “daemon off;”
ADD包含类似tar的解压功能
ADD
ADD “
如果单纯复制文件,Docker推荐使用COPY
COPY
COPY [“
———————-dockerfile——————————–
##first dockerfile for test
FROM ubuntu:14.04
MAINTAINER dormancypress “xxxx@xxxx.com“
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]
添加卷
VOLUME [“/data”]
从镜像创建一个新容器时,在容器内部设置工作目录。也可以在构建中,为后续的工作指定工作目录
需要注意:通常使用绝对路径,如果使用相对路径,通常路径会传递下去
WORKDIR /path/to/workdir
用来设置环境变量
ENV
ENV
指定镜像会以什么样的用户运行
USER daemon
USER user USER uid
USER user:group USER uid:gid
USER user:gid USER uid:group
为镜像添加触发器
当一个镜像被其他镜像作为基础镜像时执行
会在构建过程中插入指令
ONBUILD [INSTRUCTION]
—————-dockerfile—————–
#first dockerfile for test
FROM ubuntu:14.04
MAINTAINER dormancypress “xxx@xxx.com“
RUN apt-get update
RUN apt-get install -y nginx
ONBUILD COPY index.html /usr/share/nginx/html/
EXPOSE 80
ENTRYPOINT [“/usr/sbin/nginx”,”-g”,”daemon off;”]
Dockerfile的构建过程
(1)从基础镜像运行一个容器
(2)执行一条指令,对容器做出修改
(3)执行类似docker commit的操作,提交一个新的镜像层
(4)再基于刚提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令,直至所有指令执行完毕
构建缓存
不使用构建缓存 docker build –no-cache
——————–dockerfile—————-
FROM ubuntu:14.04
MAINTAINER dormancypress “xxx@xxx.com“
ENV REFRESH_DATE 2015-04-01
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
查看镜像的构建过程
docker history image
Docker容器的网络基础
ifconfig 查看网络配置
sudo apt-get install bridge-utils 网桥管理工具
sudo brctl show
修改docker0地址:
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
添加虚拟网桥
sudo brctl addbr br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0
更改docker守护进程的启动配置
/etc/default/docker中添加DOCKER_OPS值
-b=br0
容器的互联
用于测试的Docker镜像Dockefile
FROM ubuntu:14.04
RUN apt-get install -y ping
RUN apt-get update
RUN apt-get install -y nginx
RUN apt-get install -y curl
EXPOSE 80
CMD /bin/bash
默认允许所有容器互联
–icc=true 默认
docker run -it –name cct1 dormancypress/cct
nginx
ctrl+p ctrl+q
docker run -it –name cct2 dormancypress/cct
ifconfig
使用代号,避免其他容器访问该容器时,由于容器重新启动产生的ip地址变化的问题
docker run –link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMAND]
拒绝容器间互联
vim /etc/default/docker
DOCKER_OPTS = “–icc=true”
sudo service docker restart
允许特定容器间的连接
–icc=false –iptables=true
–link
sudo /etc/default/docker
DOCKER_OPTS =”–iptables=true,–icc=false”
sudo iptables -L -n
清空iptables的设置
sudo iptables -F
Docker容器与外部网络的连接
ip_forward
–ip-forward=true 决定系统是否会转发流量
sysctl net.ipv4.conf.all.forwarding
iptables
是与Linux内核集成的包过滤防火墙系统,几乎所有的linux发行版本都会包含Iptables的功能
(1)表(table)
(2)链(chain)
(3)规则(rule)
ACCEPT REJECT DROP
filter表中包含的链:
INPUT
FORWARD
OUTPUT
sudo iptables -t filter -L -n
允许端口映射访问
docker run -it -p 80 –name cct5 dormancypress/cct
docker port cct5
限制ip访问容器
数据卷
数据卷是经过特殊设计的目录,可以绕过联合文件系统(ufs),为一个或多个容器提供访问
数据卷的特点
(1)数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中、
(2)数据卷可以在容器之间共享和重用
(3)可以对数据卷里的内容直接进行修改
(4)数据卷的变化不会影响镜像的更新
(5)卷会一直存在,即使挂载数据卷的容器已经被删除
sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash
指定访问权限
sudo docker run -it -v ~/datavolume:/data:ro –name dvt1 ubuntu /bin/bash
使用Dockerfile构建包含数据卷的镜像:
VOLUME[“/data”]
# For data volume Test
FROM ubuntu:14.04
VOLUME [“/data/test”,”/data/test01”]
CMD /bin/bash
docker run -it –name dvt5 –volumes-from dvt4 ubuntu /bin/bash
数据卷的备份和还原
备份:
docker run –volumes-from [container name] -v $(pwd):/backup ubuntu
tar cvf /backup/backup.tar [container data volume]
docker restart dvt5
docker attach dvt5
启动容器进行备份
docker run –volumes-from dvt5 -v ~/backup:/backup –name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume
典型容器集群管理工具
(1)容器调度
Docker Swarm k8s Apache Mesos CoreOS Fleet Openstack Magnum
(2)配置管理(同步集群状态)
Etcd Zookeeper Consul
(3)服务发现
Etcd Haproxy Consul
(4)日志/监控/报警
ELK stack cAdvisor Prometheus
云集规模容器管理系统
(1)容器调度
(2)服务发现
(3)网络配置
(4)安全配置
(5)负载均衡
(6)数据持久化
(7)容错/高可用
(8)日志管理/容器监控
Docker Machine
一条命令,多环境部署
支持列表
VirtualBox Vmware Microsoft Hyper-V openstack Microsoft Azure RackSpace
Google Cloud Platform Amazon Web Services DigitalOcean
下载Docker machine
(1)curl -L https://github.com/docker/machine/releases/download/v0.4.0/dockder-machine_linux-amd64 > /user/local/bin/docker-machine
(2)chmod +x /user/local/bin/docker-machine
(3)docker-machine -V
(4)docker-machine create -d virtualbox test
(5)docker-machine ls
Docker machine命令集
start/stop/restart/kill
active/config/env/inspect/ip/status/url -获取Docker machine信息
ssh 远程登陆Docker Machine
scp 本机与Docker Machine或Docker Machine之间传输文件
(1)docker-machine env test
通过本机的Docker客户端连接远端的Docker Machine
(1)eval “$(docker-machine env test)”
(2)docker run -d -t index.alauda.cn/library/ubuntu bash
(3)docker ps
(4)docker-machine ssh test
Docker Compose
定义和运行多个Docker容器的工具
一个文件-docker-compose.yml
一条命令-docker-compose up
curl -L https://xxxx
docker-compose.yml
image:ubuntu:latest
build:/path/to/build/dir
dockerfile:使用指定的Dockerfile
command:覆盖默认命令
容器配置:
links:
-db:database
external_links:
-project_redis_1
ports:
-“3000”
-“8000:80”
expose:
- “3000”
volumes:
- /var/lib/mysql:/var/lib/mysql
environment:
- MYSQL_USER = mysql
docker-compose.yml
web:
build: .
ports:
- “5000:5000”
volumes:
- .:/code
links:
- redis
redis:
image:redis
Docker Compoase命令集
管理镜像 -build/pull
管理服务 -up/start/stop/kill/rm/scale
服务状态 -ps/logs/port
一次性命令 -run
Docker Swarm
容器管理技术
Kubernetes
(1)开源Docker容器编排系统
(2)轻量级、简单
(3)公有云、私有云以及混合云中部署
(4)模块化(modular),可插拔化,可挂接,可组合
(5)自动恢复,自动重启,自动复制
kubectl get nodes
kubectl get events
Pods
创建,调度以及管理的最小单元
共存的一组容器的集合
容器共享PID,网络,IPC及UTS命令空间
容器共享存储卷
短暂存在(pending running succeed fail)
kubectl create -f pod.yaml
kubectl get pods
kutectl delete pods nginx
kubectl get pods redis -o yaml
Labels
用以标示对象(如Pod)的key/value对
组织并选择对象子集
Replication Controllers
确保在任一时刻运行指定数目的Pod
Services
抽象了一系列Pod并定义其访问规则
固定IP地址和DNS域名
通过环境变量和DNS发现服务
负载均衡
外部服务 ClusterIP,NodePort,LoadBalancer
Docker常用命令:
https://www.jianshu.com/p/5caa68150661
常用命令
docker run -p 0.0.0.0:6000:6000 –name “test” -it centos
docker exec -it 4d34fbf944a5 /bin/bash
安装portainer管理平台
1 | # 搜索镜像 |