安装 docker

官网提供多种安装方式,这里使用 Install from a package

通过 wget 下载对应的 deb, 点这里查找 ,然后使用 dpkg 安装

$ sudo dpkg -i /path/to/package.deb
如果安装过程中提示缺少依赖包 libltdl7, 则先安装 apt-get install libltdl7
$ docker 查看所有可用命令
$ docker run --help / -h 查看命令帮助信息


阿里云 docker 加速

Hub

https://dev.aliyun.com/search.html

阿里加速器(管理中心)
 sudo mkdir -p /etc/docker
 sudo tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["Your url"]
 }
 EOF
 直接复制上一条命令然后终端中粘贴,并回车执行
 作用是将 EOF 中的内容添加到 daemon.json 文件中
 tee 命令 :Copy standard input to each FILE, and also to standard output.
 <<-'END'
 内容块
 
END
 
这个用法方便输入多行内容,关键字可以自定,不一定是 'EOF'

 刷新服务并重启 docker
 sudo systemctl daemon-reload
 sudo systemctl restart docker

命令权限
 Docker 命令需要使用 sudo 即 root 用户权限,通过将用户加入到 docker 用户组来避免一直输入 sudo
 $ sudo usermod -aG docker $USER
 完成后需要退出重新登录

下载镜像
 $ docker pull ubuntu 
 不加版本号,则为 latest

删除镜像
 $ docker rmi IMAGE

创建新容器
 $ docker run ubuntu /bin/echo 'hello maiyo'
 如果不指定命令,则使用镜像定义的命令,如: ubuntu 是 /bin/bash,nginx 是 nginx -g , 可通过 $ docker inspect ubuntu 查看
 如果不指定容器名称,则会随机分配

带交互的容器(可进入容器内)
 $ docker run --name myserver ubuntu -it /bin/bash

后台运行容器
 $ docker run --name myserver -d ubuntu ping www.baidu.com
 创建一个后台运行容器,并在后台一直执行 ping 命令
 $ docker logs --follow myserver
 
通过查看容器日志,可看到容器一直在运行 ping... 命令
 

 进入后台运行容器
 可以通过这两个命令
 attach : Attach local standard input, output, and error streams to a running container
 $ docker attach CONTAINER (ID or NAME)
 exec : Run a command in a running container
 $ docker exec -it CONTAINER /bin/bash
 
区别:使用 attach 退出(exit)或终止容器,容器也停止运行,exec 不会

挂载 volume
$ docker run -v /home/user/www:/www ubuntu /bin/bash
冒号前:source dir 宿主机目录(可省略)
冒号后:destination dir 容器内目录(必须为绝对路径)
source 若为相对路径则会在 /var/lib/docker/volumes/ 目录下创建宿主机目录
如果省略 source 则随机生成一个目录名
$ docker insepect CONTAINER 查看 "Mounts" 部分了解挂载详情
将挂载目录设为只读
$ docker run -v source:destination:ro ubuntu

连接容器

一般的多个容器之间的通信可以通过:

1.容器 IP (容器重启后 IP 会变)
2.宿主机 IP + 容器 PORT
3.连接容器后的别名 如 defaultZone=http://eurekaserver:8761/eureka/ ,eurekaserver 为别名
$ docker run -d --name mynginx --link CONTAINER:alias nginx
其中 CONTAINER 为连接的目标容器,alias 为取的别名
进入容器内通过查看 $ cat /etc/hosts, 可以看到加入一条解析规则
127.0.0.1       localhost
172.17.0.5      275eb3cce567
172.17.0.4      eurekaserver 57cb35ef5c01 app_eureka_server
172.17.0.5 当前容器的 IP
172.17.0.5 link 容器的 IP , 与映射,后面是 link 容器的容器 ID 与容器名称

常见问题
$ docker run -d ubuntu /bin/bash
使用上面的命令创建容器后,容器马上就退出了
因为在 docker 中,如果容器运行命令不是一个一直挂起的命令如 ping、top 等,在执行完命令后就会自动退出
如果想在后台运行 ubuntu 可以使用带交互的方式运行并使用 exec 进入容器,如下:
$ docker run -dit ubuntu /bin/bash
$ docker exec -it CONTAINER /bin/bash 

 
停止、重启、运行容器
 $ docker stop / restart / start CONTAINER

查看所有容器
 $ docker ps -a / --all (不带参数则查看运行中的容器)

删除容器
 $ docker rm CONTAINER

查看容器日志
 
$ docker logs CONTAINER
拷贝文件及目录
$ docker cp nginx_container:/etc/nginx/nginx.conf /root/nginx/conf/ 拷贝文件
$ docker cp nginx_container:/etc/nginx/ /root/nginx/conf/ 拷贝目录

端口、IP、映射
容器端口
$ docker ps
通过 PORTS 列,可查看到容器开放的端口

容器IP
$ docker inspect CONTAINER
查看 IPAddress

端口映射
$ docker port CONTAINER
列出指定的容器的端口映射

创建镜像

实际上是从一个变化后(如环境配置或项目部署)的容器上创建一个新的镜像

$ docker commit -m 'Commit message' -a 'author' CONTAINER maiyo/image:latest


通过 Dockerfile 创建镜像

在指定目录创建 Dockerfile 文件(无后缀)


在 Dockerfile 文件中通过指令创建镜像,指令如下:

FROM ubuntu
 
MAINTAINER Maiyo maiyo@email.com (可选)
VOLUME /tmp
 
RUN apt-get update
 
RUN apt-get install net-tools

VOLUME:

创建一个挂载卷,使容器内的 /tmp 目录映射到宿主机上,实现可持久化

与 run -v 创建容器不同的是,VOLUME 不能指定宿主的位置

$ docker insepect IMAGE 查看 "Volumes" 部分了解挂载详情


CMD 与 ENTRYPOINT:

都是用作启动时执行命令(CMD / ENTRYPOINT 在 run 时执行,build 时并不执行)

CMD / ENTRYPOINT,在 Dockerfile 中多个无效,只有最后一个起作用,多个命令用 && 隔开

使用 CMD 定义,如果 docker run 时,不带 command 则 CMD 定义的命令将被执行,如果带 command 则 CMD 定义的命令被覆盖不被执行

使用 ENTRYPOINT 定义,不管 docker run 时带不带 command 都将被执行


使用 build 命令创建镜像

$ docker build -t maiyo/demo:latest /home/maiyo/docker/

-t / --tag : 格式 'name:tag' ,必须小写

path : 注意是 Dockerfile 文件所在的目录

结束后通过 $ docker images 可查看到新建的镜像


创建过程中通过创建临时容器跑 RUN 命令,结束之前将删除临时容器

如果失败需要先删除临时容器再删除失败的镜像