一、简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
二、安装
使用官方安装ubuntu18.04
1 | curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun |
1 | sudo service docker start(启动) |
Ubuntu18.04系统docker换源
修改 /etc/docker/daemon.json 文件,一般不存在,新建一个就可以了
1 | {"registry-mirrors":["https://reg-mirror.qiniu.com/"]} |
重启服务
1 | #重新加载某个服务的配置文件,如果新安装了一个服务,归属于 systemctl 管理,要是新服务的服务程序配置文件生效,需重新加载 |
Mac下
安装地址:https://docs.docker.com/desktop/mac/install/
切换镜像,先到阿里云地址上复制:地址
1 | "registry-mirrors": [ |

三、镜像与容器
- 镜像:用来启动容器的只读模板,是容器启动所需的rootfs,类似于虚拟机所使用的镜像。
- 容器:Docker 容器是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
镜像是容器的基础,可以简单的理解为镜像是我们启动虚拟机时需要的镜像,容器时虚拟机成功启动后,运行的服务。
四、镜像命令(images)
1 | docker version # 显示 Docker 版本信息。 |
docker-compose
docker-compose down --rmi all --volumes
- 停止 Docker Compose 文件中定义的所有服务。
- 删除与 Docker Compose 文件关联的所有容器。
- 删除与 Docker Compose 文件关联的所有网络。
- 删除与 Docker Compose 文件关联的所有卷。
- 删除与 Docker Compose 文件关联的所有镜像(包括构建的镜像和来自外部的镜像)
docker images

1 | REPOSITORY 镜像的仓库源 |
docker search
1 | docker search 某个镜像的名称 对应DockerHub仓库中的镜像 |
docker pull
1 | # 下载镜像 |
docker rmi
1 | # 删除镜像 |
docker save(将一个镜像导出为文件)
将指定镜像保存成 tar 归档文件,**-o :**输出到的文件
1 | root@Ubuntu:~# docker images |

docker load(将文件导入为一个镜像,会保存该镜像的的所有历史记录,文件大)
导入使用 docker save 命令导出的镜像,**–input , -i :** 指定导入的文件,代替 STDIN,**–quiet , -q :** 精简输出信息

docker push
上传镜像到仓库,用户在DockerHub网站注册后,即可上传自制的镜像,第一次使用时,会提示输入登录信息或进行注册
创建镜像
1、基于已有镜像创建 2、基于本地模板导入 3、基于DockerFile创建
1、docker commit 从容器创建一个新的镜像(停止容器后创建)
1 | -a:作者信息 |
2、基于本地模板导入
推荐使用OpenVZ提供的模板创建,OpenVZ模板下载地址
1 | cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04 |
五、容器命令(Container)
有镜像才能创建容器
docker pull centos
启动
1 | # 命令 |
列出所有运行的容器
1 | # 命令 |
退出容器
1 | exit # 容器停止退出 |
启动停止容器
1 | docker start (容器id or 容器名) # 启动容器 |
删除容器
1 | docker rm 容器id # 删除指定容器 |
后台启动容器
--restart=always自启动容器
–restart=always参数能够使我们在重启docker时,自动启动相关容器
1 | #第一次启动时添加 |
1 | # 命令 |
查看日志
1 | # 命令 |
查看容器中运行的进程信息
1 | # 命令 |
查看容器/镜像的元数据
1 | # 命令 |
进入正在运行的容器
1 | # 命令1 |
从容器内拷贝文件到主机上
1 | # 命令,可以互相拷贝 |
更新容器状态(update)
参考:https://www.lwhweb.com/posts/26195/
1 | #更新容器的重启策略 |
导入导出容器,迁移镜像
导出镜像 export(将一个容器导出为文件)
1 | #方式一 |
1 | root@Ubuntu:~# docker ps |
导入镜像 import(将容器导入成为一个新的镜像,丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照)
**-m :**提交时的说明文字
1 | root@Ubuntu:~# ls |
实际上,既可以使用docker load命令来导人镜像存储文件到本地的镜像库,又可以使用docker import命令来导人一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导人时可以重新指定标签等元数据有低。
六、DockerFile
构建步骤:
编写DockerFile文件
docker build 构建镜像
docker run
基础知识:
每条保留字指令都必须为大写字母且后面要跟随至少一个参数
指令按照从上到下,顺序执行
#表示注释
每条指令都会创建一个新的镜像层,并对镜像进行提交
流程:
docker从基础镜像运行一个容器
执行一条指令并对容器做出修改
执行类似 docker commit 的操作提交一个新的镜像层
Docker再基于刚提交的镜像运行一个新容器
执行dockerfifile中的下一条指令直到所有指令都执行完成!
指令
1 | FROM # 基础镜像,当前新镜像是基于哪个镜像的 |
自己的镜像:登陆后的默认路径、vim编辑器、查看网络配置ifconfifig支持
准备编写DockerFlie文件
1
2
3
4
5
6
7
8
9
10FROM ubuntu
MAINTAINER kaiqiang<kaiqiang>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN apt-get install vim
RUN apt-get install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "----------end--------"
CMD /bin/bash构建
1
docker build -f dockerfile地址 -t 新镜像名字:TAG . #docker build 命令最后有一个 . . 表示当前目录
运行
1
docker run -it 新镜像名字:TAG
七、Springboot整合Docker
- 创建一个简单的Sringboot项目并打包
1 |
|
- 在jar包的同级目录下编写DockerFile文件,并且一起上传到服务器
1 | FROM java:8 |
- 然后构建镜像 运行就可以访问到项目了
1 | docker build -t kaiqiang . |
- 运行
1 | docker run -d -P --name idea-ks kaiqiang kaiqiang |
八、部署nginx
1 | docker pull nginx |
九、常见错误
当进入容器中使用vim命令提示错误

1 | apt-get update |
十、使用容器构建自定义的镜像(commit),修改端口映射
参考:https://zhuanlan.zhihu.com/p/94949253
方式一
查看容器

创建新的镜像

得到新的镜像

重新使用新的镜像运行一个容器,重新配置镜像的端口等信息

方式二
先取消镜像的docker启动后容器的自启动,没有设置容器自启动不需要这一步
1
docker update --restart=no xxx
停止容器
1
docker stop xxx
停止主机docker服务
1
systemctl stop docker
进入到
/var/lib/docker/containers相应的容器中,修改hostconfig.json
8012/tcp对应的是容器内部的8012端口,HostPort对应的是映射到宿主机的端口9090
修改完成重启docker与容器
1
2systemctl start docker
docker start xxx
方式三
端口映射实际是通过主机的iptables来实现
1 | #查看映射 |
1 | Chain DOCKER (2 references) |
docker创建了一个名为DOKCER的自定义的链条Chain。而我开放8012端口的容器的ip是172.17.0.2
也可以通过inspect命令查看容器ip
1 | #通过inspect命令查看容器ip |
增加一个端口映射,比如8081->81
1 | sudo iptables -t nat -A DOCKER -p tcp --dport 8081 -j DNAT --to-destination 172.17.0.2:81 |
加错了或者想修改:先显示行号查看
1 | sudo iptables -t nat -vnL DOCKER --line-number |
删除规则3
1 | sudo iptables -t nat -D DOCKER 3 |
十一、Docker Hub
注册
注册网址:https://registry.hub.docker.com/
1 | root@Ubuntu:~# docker login |
十二、实践
1、挂载容器目录
作用:挂载宿主机的一个目录
-v 本地目录:容器目录 或 -v 容器目录
1 | docker run -it -v /宿主机目录:/容器目录 镜像名 /bin/bash |
2、启动主从模式
-e 传递环境变量
–link可以用来链接2个容器
1 | #创建一个命令为mysql的主容器 |
3、使用Mysql
- 下载镜像
- 启动mysql容器
容器内的Mysql提供了root账号和admin账号,其中root账号无需密码,但只允许本地访问
1 | #mysql命令行中使用如下命令查看 |
使用 docker logs eef查看adamin密码
启动容器时指定admin账号和密码
1 | docker run -d -P -e MYSQL_PASS="123456789" mysql |