安装 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 文件中通过指令创建镜像,指令如下:
MAINTAINER Maiyo maiyo@email.com (可选)
VOLUME /tmp
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 都将被执行
$ docker build -t maiyo/demo:latest /home/maiyo/docker/
-t / --tag : 格式 'name:tag' ,必须小写
path : 注意是 Dockerfile 文件所在的目录
结束后通过 $ docker images 可查看到新建的镜像
创建过程中通过创建临时容器跑 RUN 命令,结束之前将删除临时容器
如果失败需要先删除临时容器再删除失败的镜像