$ docker tag ubuntu:17.10 username/ubuntu:17.10
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 17.10 275d79972a86 6 days ago 94.6MB
username/ubuntu 17.10 275d79972a86 6 days ago 94.6MB
$ docker push username/ubuntu:17.10
$ docker search username
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu
[vagrant@localhost ~]$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
a51998aeaa00 bridge bridge local
d8463e2bd0fe host host local
89ba79b8b48d my_network bridge local
84d05dcc187f none null local
[vagrant@localhost ~]$ sudo docker volume rm my_volume
Error response from daemon: unable to remove volume: remove my_volume: volume is in use - [e5f017eb4055f9d4d5ae0989c3e2893820cfe9292c0d38ac411f7611a1229cda, 4943f3b685e7ccef352e2127590c0ca82204ab687dd2379a1e6548dcbd700066]
Docker 简介
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。
安装
镜像
镜像是 Docker 中最核心的概念,一个容器可以理解为镜像的实例化
Dockerfile 指令集
COPY 复制文件
COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。 <目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)。目标路径不需要事先创建,如果目录不存在会在复制文件前先行创建缺失目录。
ADD 更高级的复制文件
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
CMD 容器启动命令
容器就是进程 ,既然是进程,那么在启动容器的时候,需要指定所运行的程序及参数。CMD 指令就是用于指定默认的容器 主进程 的启动命令的。
CMD 有两种格式:
如果使用 shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:
在实际执行中,会将其变更为:
使用 nginx 以后台守护进程形式启动 nginx 服务
在实际执行中,会将其变更为:
这样将导致sh执行完后sh主进程退出,导致容器退出 正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行。比如:
ENTRYPOINT 入口点
ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 --entrypoint 来指定。
当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
ENV 设置环境变量 格式有两种:
定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。比如在官方 node 镜像 Dockerfile 中,就有类似这样的代码:
VOLUME 定义匿名卷 格式为:
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化。当然,运行时可以覆盖这个挂载设置。
EXPOSE 声明端口
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。
WORKDIR 指定工作目录
使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
USER 指定当前用户
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。
当然,和 WORKDIR 一样,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。
如果以 root 执行的脚本,在执行期间希望改变身份,比如希望以某个已经建立好的用户来运行某个服务进程,不要使用 su 或者 sudo,这些都需要比较麻烦的配置,而且在 TTY 缺失的环境下经常出错。建议使用 gosu。
容器
容器可以理解为独立运行的一个或者一组应用,它完全隔离和宿主主机的环境。
在运行时可以指定新的命令来替代镜像设置中的这个默认命令
新建并启动容器
后台新建并启动容器 在使用 -d 参数时,容器启动后会进入后台。
交互式运行容器
停止容器
启动容器
要获取容器的输出信息,可以通过 docker container logs 命令。
进入容器
删除容器
删除所有停止状态的容器
仓库
仓库(Repository)是集中存放镜像的地方。
Docker Hub
前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了数量超过 15,000 的镜像。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现
登录 Docker Hub 可以通过执行
docker login
命令交互式的输入用户名及密码来完成在命令行界面登录 Docker Hub。 你可以通过docker logout
退出登录。拉取镜像 你可以通过 docker search 命令来查找官方仓库中的镜像,并利用 docker pull 命令来将它下载到本地。
推送镜像 用户也可以在登录后通过 docker push 命令来将自己的镜像推送到 Docker Hub。
网络
Docker允许外部网络访问到容器内部。同样也可以使用容器互联的方式实现各个容器之间的访问。
外部网络访问容器
Docker容器中运行的应用,如果想要通过外部访问这个应用,可以使用
-P
或者-p
将容器应用开放的端口映射到主机的端口上面。外部就可以通过访问宿主的ip加上映射的端口来访问容器内的应用了。当使用 -P 标记时,Docker 会随机映射一个的端口到内部容器开放的网络端口。
-p 则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
-p 标记可以多次使用来绑定多个端口
容器互联
创建一个新的 Docker 网络
查看所有的容器网络
运行容器 并且 指定容器网络 下面的操作证明同属于my_network网络 容器centos1 和容器centos1 是容器互联的状态
查看端口映射情况
sudo docker port container_name
sudo docker inspect container_name
加入和移除网络
加入网络
存储
Docker 容器管理数据主要有两种方式
数据卷volumes
数据卷有很多特性
创建数据卷
查看所有数据卷
查看特定的数据卷的详细信息
挂在数据卷到容器
上述实例的两个容器同时挂载了my_volume数据卷,所以他们的数据是共享的
随机存储位置 -v
也可以使用inspect查看当前容器的数据卷
删除数据卷
当数据卷在使用中的时候删除会出现警告
数据卷是用来做数据持久化的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
挂在主机目录
挂在主机上的本地目录到指定的容器
挂在当前的加目录的文件夹到nginx的目录,可以在本地修改代码同步到容器
数据容器 --volumes-from
docker-compose
安装
启动项目 后台
实战 lnmp
https://github.com/DanceSmile/docker_php_run_context
swarm 集群
结语
Docker 简化了部署环境,平衡了不同平台之间的差异。
扩展阅读
Docker100问