#Docker入门
一、安装
概述:
- 镜像:docker基于镜像运行容器,镜像是docker生命周期的“构建”部分。
- Registry:用来保存镜像。
- 容器:docker的启动和执行阶段。
1.1 安装
卸载docker
yum list installed | grep docker
yum remove 上条命令列出的docekr
默认配置下,在 CentOS 使用 Docker 可能会碰到下面的这些警告信息:
WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled
添加内核配置参数以启用这些功能。
tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
添加yum源:
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
yum 安装
sudo yum update
sudo yum install docker-engine
1.2 启停docker
systemctl start docker
docker info
1.3 非root启动
sudo groupadd docker
sudo gpasswd -a ${USER} docker #将当前用户加入docker组
sudo systemctl restart docker #重新启动docker服务
#当前用户退出系统重新登陆
docker ps #运行docker命令,检查是否正常
二、镜像
docker images # 列出本地镜像
docker pull ubuntu:12.04 #拉取
docker search ubuntu #查找镜像
docker rmi 2dc68ff797db #删除镜像
docker rmi `docker images -a -q` #删除所有镜像
docker rmi $(docker images -q -f dangling=true) #删除虚拟镜像
docker rmi $(docker images --filter "dangling=true" -q --no-trunc)
docker system prune -f # 系统清理
构建镜像:
2.1 登录hub
docker login #登录hub
docker logout #注销hub,删除认证信息
2.2 commit命令创建镜像
在一个镜像中安装nginx,把它作为web服务,保存这个状态,提交到hub。
#运行base
docker run -i -t ubuntu /bin/bash
#安装
root@69425bcf953e:/\#apt-get -yqq update &&
apt-get -y install apache2
exit
#提交创建镜像
docker commit 69425bcf953e erdaoya/apach2
# 查看
docker images erdaoya/apach2
# 运行刚才提交的镜像
docker run -t -i erdaoya/apach2 /bin/bash
2.3 Dockerfile创建镜像
mkdir static_web
vim Dockerfile
docker build -t="erdaoya/static_web:v1"
#Dockerfile放在git仓库的情况
docker build -t="erdaoya/static_web:v1" git@github.com.xx/docker_static_web
-t
:指定‘镜像名:标签’,标签不写默认latest
Dockerfile
# Veriosn:0.0.1
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi,I am in your container'\>/usr/share/nginx/html/index.html
EXPOSE 80
2.4.Dockerfile
2.4.1 Dockerfile构建
格式
docker build [选项] 路径
docker根据dockerfile构建镜像时,会根据修改,使用所修改步骤之前的镜像。如果一定要忽略缓存,可使用–no-cache
docker build --no-cache -t="erdaoya/static_web:v1" .
使用history命令看镜像执行详细:
docker history 3ffdf8907657
2.4.2 从新镜像启动容器
#启动容器
docker run -d -p 80 ---name static_web erdaoya/static_web \/usr/sbin/nginx -g "daemon off;"
docker ps -l
docker port 3ffdf8907657 80 #端口映射情况
curl curl localhost:32772
2.4.3 Dockerfile指令
FROM <image>:<tag>
: 获取镜像MAINTAINER <name>
: 作者信息RUN <command>
:运行命令,每一个run一层。LABEL <key>=<value> <key>=<value> <key>=<value> ...
: adds metadata to an imageEXPOSE <port> [<port>...]
:暴露的端口号ENV <key>=<value> ...
: 设置环境变量。ADD <src>... <dest>
: 添加文件到docker文件系统,src可以是URL,可以是一个tar(自动解压)。COPY <src>... <dest>
: 复制,和ADD相似。当使用本地目录为源目录时,推荐使用 COPY。ENTRYPOINT ["executable", "param1", "param2"]
:配置容器启动后执行的命令。只能有一个,当指定多个时,只有最后一个起效。VOLUME
:容器访问宿主机上的目录USER
: 设置容器IDWORKDIR
: 设置CMD指明的命令的运行目录- CMD
CMD ["executable","param1","param2"]
:(exec form, this is the preferred form)CMD ["param1","param2"]
:(as default parameters to ENTRYPOINT)CMD command param1 param2
:(shell form)
dockerfile模版
FROM fedora:20
MAINTAINER James Turnbull 'xx@xx.com'
ENV REFRESHE_AT 2016-07-01
RUN yum -q makechche
三、容器
3.1 运行
docker run -i -t ubuntu /bin/bash #运行容器
docker run --name new_ubuntu -i -t --rm ubuntu /bin/bash #启动容器并命名(--name)
docker run -p 80:80 -v /data:/data -d $(ID)
--rm
: #容器结束删除
-d
:后台启动
-i
: 保证容器标准输入STDIN开启
-t
:告诉docker分配一个伪终端
-p
:端口映射
-v
:数据卷映射
3.2 查看状态
docker ps -a #查看容器列表,包括正在运行和停止的;
docker ps #查看正在运行的容器
ps -aux #查看容器进程,在容器中运行
inspect
# 显示更底层的容器或image信息
docker inspect ad2c4ba35c15
#显示实例ip:
docker inspect --format='{{.NetworkSettings.IPAddress}}' $INSTANCE_ID
# 列出所有绑定的端口
docker inspect --format='{{range $p, $conf := .NetworkSettings.Ports}} {{$p}} -> {{(index $conf 0).HostPort}} {{end}}' $INSTANCE_ID
# 获取配置信息
docker inspect --format='{{json .config}}' $INSTANCE_ID
3.3 启动停止删除
docker start new_ubuntu
docker stop 69425bcf953e
docker rm new_ubuntu
3.4 进入容器
有4中方式:attach. ssh nsenter exec
docker attach new_ubuntu(name,ID)
docker exec -it 775c7c9ee1e1 /bin/bash
3.5 查看日志
docker run --name daemon_dave -d ubuntu /bin/bash -c "while true;do echo hello world;sleep 1;done" #创建守护容器
docker logs daemon_dave #查看日志
docker logs -f daemon_dave #动态查看日志
docker logs -ft daemon_dave
docker logs --tail 10 daemon_dave
四、仓库
1.本地启动官方提供的仓库:
docker run -p 5000:5000 registry:2 -v /opt/data/registry:/opt/data/registry
使用方如果出现以下错误:
ERROR: Get https://10.69.42.85:5000/v1/_ping: http: server gave HTTP response to HTTPS client
修改配置:在OPTIONS选项后面添加 –insecure-registry=10.69.42.85:5000
vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false --insecure-registry=10.69.42.85:5000'
需要设置客户端如下:
docker -d ----insecure-registry 10.69.42.85:5000
2.使用仓库给镜像打tag
格式 : docker tag IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
docker tag 89a97ea996d0 host:port/username/image_name:v1
3.push
docker push host:port/username/image_name:v1
五、docker-compose
5.1 模板文件
image
: 镜像名build
:dockerfile路径ports
: 端口号映射volumes
: 数据卷映射links
: 容器互联command
: 覆盖容器启动后默认执行的命令external_links
: 链接到 docker-compose.yml 外部的容器expose
: 暴露端口给连接的容器。olumes_from
: 从另一个服务或容器挂载它的所有卷environment
: 设置环境变量env_file
: 从文件中获取环境变量,可以为单独的文件路径或列表,内容如:RACK_ENV=development
extends
:基于已有的服务进行扩展,继承net
: 设置网络模式:bridge, host, none, containerpid
: 跟主机系统共享进程命名空间dns
: 配置 DNS 服务器。可以是一个值,也可以是一个列表cap_add
: 添加容器的 Linux 能力cap_drop
: 放弃容器的 Linux 能力dns_search
: 配置 DNS 搜索域。可以是一个值,也可以是一个列表。
5.2 指令
build
: 重新构建服务。--force-rm
删除过程中的临时容器,--pull
始终通过pull获取最新版本kill
: 强制停止服务容器logs
: 查看服务容器的输出port
: 打印某个容器端口所映射的公共端口ps
: 列出项目中目前的所有容器pull
: 拉取服务依赖的镜像rm
: 删除所有(停止状态的)服务容器run
: 在指定服务上执行一个命令scale
: 设置指定服务运行的容器个数。strat
: 启动已经存在的服务容stop
: 停止已经处于运行状态的容器up
: 它将尝试自动完成包括构建镜像,(重新)创建服务,启动down
: 停止容器,删除容器、数据、镜像
5.3 安装
curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
六、网络配置
6.1 基础配置
docker run -p 5000:5000 ...
: 绑定本地所有地址的端口映射
docker run -p 127.0.0.1:5000:5000
:只对127.0.0.1映射
docker run -p 127.0.0.1::5000
: 绑定 localhost 的任意端口到容器的 5000 端口
docker port 容器 端口
: 查看端口配置
6.1 高级配置
//TODO 待续