docker学习记录
如果不是真的菜 🐔, 谁又愿意当韭菜呢
docker 的基本概念
docker 和 k8
什么是镜像 image?
操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。
什么是容器 container?
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。
容器和虚拟机的区别
- 容器是 APP 层面的隔离
- 虚拟化是物理资源层面的隔离
看两张图帮助理解
点我!点我!
容器

虚拟化

vagrant
vagrant 是用于构建及配置虚拟开发环境的软件, 需要借助 virtualbox/vm 才能使用, 否则使用 vagrant 报错
virtualbox 需要事先安装, vagrant 的安装可以通过官网下载 pkg 文件进行安装
vagrant 常用命令
vagrant init 系统版本: 初始化需要安装的系统的配置文件, 会生成一个文件名为 vagrantfile. 可以通过在官网上直接查询 vagrantfile 配置vagrant up: 下载 vagrantfile 中配置的系统, 结束后启动系统, 如果已经下载过了系统则直接启动vagrant ssh: 本地连接登录虚拟机vagrant halt: 关闭系统vagrant status: 查看当前虚拟机状态
安装 docker
博主是通过 vagrant 安装 centos 的方式在 linux 上安装 docker, 为了和本机系统隔离. 参考centos 安装 docker
window 和 mac 都可以在官网搜索相应安装包下载
tips centos 下 docker 命令都需要 sudo 执行, 可以通过以下方式避免输入 sudo, 记得重新登入 shell
1 | |
docker 镜像
docker 官方自带的镜像非常慢, 可以使用阿里云或者中科大等提供的镜像, mac 可以直接通过图像化管理工具设置镜像源, perforence -> Docker Engine, 把下面的配置添加到 json 中
1 | |
centos7 更换镜像源
- 写入镜像源
sudo vi /etc/docker/daemon.json
1 | |
- 重新启动 docker
1 | |
mac配置镜像

docker-machine
docker-machine也可以像vagrant一样创建并管理多台虚机
安装
MacOS 安装
1 | |
检查安装成功
1 | |
常用命令
docker-machine create [name]: 创建一台安装好 docker 的 linux 虚机,[name]为自定义虚机名称docker-machine ls: 查看创建的虚机列表docker-machine stop [name]: 关闭[name]虚机docker-machine start [name]: 开启[name]虚机docker-machine ssh [name]: 登录[name]虚机docker-machine rm [name]: 删除[name]虚机
以下内容未额外说明都是在 vagrant 创建的 centos 虚机上进行演示
image & container
上面说过了 image 是一个独立的文件系统, container 是不同 image 在这个文件系统上的叠加生成的实例
Hub
docker 也提供了像 github 一样的托管平台, 存放常用的一系列软件的 image 镜像. 点击访问
可以通过docker pull [IMAGE NAME]的方式下载 image
亲手写一个 image demo
- 写一个简单的 C 语言文件
hello.c
1 | |
- 编译成二进制文件
hello
1 | |
- 编写
Dockerfile文件
1 | |
- 生成 image
1 | |
- 运行 image
1 | |
对于docker run的 container 运行后会直接退出, 如果想进行交互可以加上标识符-it, 例如docker run -it ubuntu:14.04, 可以通过docker container ls查看正在运行中的 container, docker container ls -a查看运行结束已经退出的 container
常见命令
所有命令可以通过docker --help查看
docker container ls: 查看正在运行中的 container, 简写docker psdocker container ls -a: 查看已退出的 container, 简写docker ps -adocker image ls: 查看所有镜像, 简写docker imagesdocker rm [CONTAINER ID]: 删除 containerdocker rmi [IMAGE ID]: 删除 image, 需要先把 image 对应的 container 都删除docker rm $(docker container ls -f "status=exited" -q): 删除符合过滤条件的 container,-f --filterfilter output based on conditions provided,-q --quietonly display container IDs
Dockerfile
生成 image 的描述文件
常见指令
FROM
基于的镜像, FROM scratch没有基于的镜像, FROM centos基于最新发行版的 centos 镜像
RUN
在 docker build 构建镜像的过程中执行, 每多一个RUN,image 就会多一层 layer
1 | |
WORKDIR
类似 linux 中的 cd, 对于不存在的目录会自动创建, 不同于 image 的 layer 都是新建的一层, workdir 创建的目录会一直存在. 使用 WORKDIR, 不要使用 RUN cd 使用绝对路径
1 | |
ADD or COPY
将上下文目录资源复制到容器中的指定位置, ADD 和 COPY 的功能差不多, 官方推荐使用 COPY. 因为 ADD 复制压缩文件时会同时将文件解压缩.
对于远程资源还是要使用 curl 或者 wget
ENV
定义常量, 推荐经常使用
1 | |
CMD
和 RUN 指令类似, RUN 在 docker build 时运行, CMD 在 docker run 时运行. 为启动的容器指定默认要运行的程序, CMD 指令会被 docker run 命令行参数中指定的指令所替换, 如果 dockerfile 中存在多条 CMD 指令时, 只有最后一条会被执行
ENTRYPOINT
和 CMD 类似, 但是不会被 docker run 命令行指定的指令所替换, 而且这些命令行参数会被当成参数传给 ENTRYPOINT, 如果运行 docker run 时使用了--entrypoint, 将覆盖 CMD 指令, 如果 dockerfile 中存在多条 ENTRYPOINT 指令, 只有最后一条会被执行
更多的指令参考官网 dockerfile
发布 image
- 首先要在 docker hub 上注册账号, 注册成功后记住自己的用户名
docker login命令行中登录docker tag [IMAGE NAME] 你的用户名/image名称: 给当前需要上传的镜像打上标签, 这里必须用自己的用户名否则会提示 permission denieddocker images就可以看到名为你的用户名/image名称的镜像了docker push 你的用户名/image名称上传到 docker hub
参考资料
可能是把 docker 奖的最清楚的一篇文章了
30 分钟快速入门 Docker 教程
通俗理解 Docker 是什么
Day6:把 Docker Image Push 到 Docker Hub