前言
初学docker,记录下,强烈推荐这篇文章理解docker。
知识
git
用过git的同学肯定感受到通过git管理代码是多么方便,我认为git主要作用有
- 本地管理代码版本:提交,回退,查看修改。如果没有git,可能会整天担心,改动这里,会不会影响原本其他功能?有git,影响了,就回退吧,写代码顾虑少了很多。
- 远程代码版本同步:闻说,很久以前将代码部署到服务器是用ftp的,要保证服务器端代码与本地一致很麻烦…,而git,能百分比保证。
git与docker
- git管理的是代码,在A主机写好的代码,在B主机git pull A机仓库就能得到完全一致的代码。
- docker管理的是环境,在A机通过docker能正常运行nginx,php,mysql,通过docker,能很方便地同步到B机中。
- Docker Hub对应 GitHub。
docker
-
通过docker运行的服务->docker->操作系统,对通过docker运行的服务来说,操作系统是透明的,即不管是什么操作系统,我照样运行我的,docker处理了操作系统差异,提供了上层所希望的环境。
-
获得镜像的方式:
- 方式1:Dockerfile —生成—> 镜像images
- 方式2:Docker pull —获取–> 镜像
-
**容器 = 镜像 + 读写层 **
-
数据存储问题:
-
首先,在容器里做的修改,如
docker cp 文件 <container-id>://路径
,当容器被删除后,修改就不存在了。要想保存修改,可以docker commit
生成新镜像,下次通过新镜像docker run
就能得到修改后的。理解1:为什么容器被删除后,修改就不存在了呢?
通过docker info可查看到docker根目录,centos7下是/var/lib/docker/。当通过镜像生成容器,会生成/var/lib/docker/container/容器id 目录,复制过来的文件就保存在类似这些临时目录中,当容器删除了,目录不存在,修改自然不存在了。(实际复制过来的文件不是保存到/var/lib/docker/overlay2/的某个目录中去了,内部原理不理解,暂时不管了)理解2:
docker cp 文件 ....
这个操作,实际作用的是某一只读层,不能理解为cp命令是对容器操作,因为容器 = 镜像 + 读写层,镜像也有只读层!理解到这个,当看到在Dockerfile里出现COPY命令就不会觉得奇怪了。 -
但如果面对数据库数据的修改,这么多修改,不可能每次都commit吧,此时可通过
volume
解决,它的作用是实现持久化存储。通过docker run -v 主机目录:容器目录
,-v
参数作主机目录与容器目录的映射
-
-
docker-compose
:管理多容器应用
命令
容器生命周期管理
-
create,start,run
-
docker create
为 指定镜像添加了一个可读写层(Read-Write-Layer),此时容器并未运行,处于Created
状态。- 通过
pstree -a | grep docker
查看,可知,未占进程。 - 可通过
-p
参数指定端口映射,类似参数属于这个命令
- 通过
-
docker start
为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。 -
docker run = docker create + docker start
,类似git pull = git fetch + git merge
docker create [-p..] <image-id> docker start <container-id> docker run [-p..] <image-id>
-
-
停止相关
docker stop <container-id> ## 向运行中容器发送SIGTERM信号,linux信号15 docker kill <container-id> ## 发送SIGKILL信号,linux信号9 docker pause <container-id> ## 利用了cgroups的特性将运行中的进程空间暂停
-
移除容器的可读写层,只能对非运行态容器执行
docker rm <container-id>
容器操作
-
列出docker容器
docker ps ## 列出运行中容器 docker ps -a ## 列出所有容器
-
获取容器/镜像的元数据。
docker inspect <image-id/container-id>
本地镜像管理
-
列出所有顶层(top-level)镜像。顶层镜像:创建容器时使用的镜像或直接pull下来的镜像
docker images
-
列出所有镜像,即列出所有可读层
docker images -a
-
移除镜像的一个可读写层
docker rmi <image-id> ## 只能移除顶层 -f <image-id> ## 强制删除中间层
-
根据Dockerfile生成本地镜像
docker build -t 标签 Dockerfile所在目录(上下文) docker build -t hello_docker .
容器rootfs命令
-
容器与主机间数据拷贝
docker cp 主机目录/文件 <container-id>://目录 docker cp index.html 6d61b7cf92c5://usr/share/nginx/html
-
将容器的可读可写层转换为只读层
docker commit -m "提交信息" <container-id> [tag]
镜像仓库
-
从Docker Hub中查看镜像
docker search php
-
从镜像仓库中拉取或者更新指定镜像
docker pull php
-
登录
docker login
-
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
docker push 镜像
info相关
docker info
docker version
docker <命令> --help 查看指定命令的介绍和参数
Dockerfile
这东西涉及很多~,简单理解,Dockerfile被用了生成镜像,Dockerfile里的每一行都是所生成镜像里的一层
两个简单例子(引用自慕课docker教程,链接在此:
-
生成输出hello docker的镜像,Dockerfile内容如下:
# 引入基础镜像,alpine是极小的linux环境,即生成的镜像会非常小 FROM alpine:latest # 镜像作者 MAINTAINER kbellx # 命令 CMD echo "Hello Docker"
-
生成带有nginx服务器的镜像
# 引入ubuntu镜像 FROM ubuntu MAINTAINER kbellx # 在ubuntu环境下,镜像环境,非主机环境 RUN apt-get update # 安装nginx RUN apt-get install -y nginx # 复制Dockerfile同级目录下index.html文件到镜像目录 COPY index.html /var/www/html # 指明docker run 镜像,所执行的命令的路径,参数等 ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] # 暴露镜像80端口 EXPOSE 80