Docker入门

#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 image
  • EXPOSE <port> [<port>...]:暴露的端口号
  • ENV <key>=<value> ...: 设置环境变量。
  • ADD <src>... <dest>: 添加文件到docker文件系统,src可以是URL,可以是一个tar(自动解压)。
  • COPY <src>... <dest>: 复制,和ADD相似。当使用本地目录为源目录时,推荐使用 COPY。
  • ENTRYPOINT ["executable", "param1", "param2"]:配置容器启动后执行的命令。只能有一个,当指定多个时,只有最后一个起效。
  • VOLUME:容器访问宿主机上的目录
  • USER: 设置容器ID
  • WORKDIR: 设置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, container
  • pid : 跟主机系统共享进程命名空间
  • 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 安装

    ```bash
    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 待续

CONTENTS