Docker 简单使用记录
- 简明教程
- 制作自己的镜像
- 深入理解Docker命令
- Dockerfile详解
需求
在一台新机器上部署环境、无需浪费生命
简明教程
Step 1
拉镜像
1 | $ docker image pull hello-world |
国内有Docker的官方仓库,例如:mysql、php、nginx
也可以使用阿里云的Docker镜像,搜索 容器镜像服务,使用前本地需要先设置访问凭证
拉取成功后,就可以看到了
1 | $ docker image ls |
Step 2
生成实例
1 | $ docker container run hello-world |
该命令具有自动抓取image文件的功能,所以可以省略上一步
1 | $ docker container run -it swoole bash |
有些容器提供的是服务,可供在命令行使用,但不会自动终止
Step 3
终止|删除容器
1 | docker container kill containerID |
此命令并不会删除image文件,因为镜像和容器的概念是不同的
到目前为止你完全可以使用Docker进行开发、测试、部署自己的代码了
以下内容会介绍docker的深入使用
制作自己的镜像
Step 1
编写两个文件
.dockerignore
写入你要忽略的文件1
2
3.git
node_modules
npm-debug.logDockerfile
写入一些配置参数1
2
3
4FROM hello-world
COPY . /app
WORKDIR /app
EXPOSE 3000FROM:以一个镜像为基础,在其上进行定制。是必备的指令,并且必须是第一条。
特殊的空白镜像:
FROM scratch
意味着不以任何镜像为基础,接下来写的指令作为镜像的第一层COPY:复制文件到镜像
WORKID:指定工作目录
EXPOSE:暴露端口
Step 2
构建镜像命令 (此外还有多阶段构建)
1 | $ docker build -t my-hello-world . |
参数 -t 表示指定image文件名字, 点.
表示当前路径
Step 3
发布镜像
1 | $ docker login --username=xxx (可指定仓库域名) |
打tag
1 | $ docker image tag [imageName] [username]/[repository]:[tag] |
然后push到仓库上
1 | $ docker image push [username]/[repository]:[tag] |
深入理解Docker命令
Commit
在解释commit
的作用前,先看一段话:
镜像是多层存储,每一层是在前一层的基础上进行的修改;而容器同样也是多层存储,是在以镜像为基础层,在其基础上加一层作为容器运行时的存储层。
当我们想修改官方nginx容器的主页内容时,进入已经启动的容器,修改nginx的index.html。
然后:
1 | docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] |
重要的两段话:
docker commit
命令除了学习之外,还有一些特殊的应用场合,比如被入侵后保存现场等。但是,不要使用docker commit
定制镜像,定制镜像应该使用Dockerfile
来完成。如果你想要定制镜像请查看下一小节。 使用
docker commit
意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然docker diff
或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的维护工作是非常痛苦的。
查看镜像内的历史记录:
1 | docker history nginx:v2 |
Container
Container作为操作容器的入口,有很多重要的命令,以下一一来介绍
run
run后面可带的参数非常多,也十分常用,需要理解和记忆
1
2
3
4
5
6
7
8
9
10
11 $ docker container run \
-d \
-p 127.0.0.2:8080:80 \
--rm \
--name wordpress \
--env WORDPRESS_DB_PASSWORD=123456 \
--link wordpressdb:mysql \
--volume "$PWD/wordpress":/var/www/html \
wordpress
- -d: 后台运行容器,并返回容器ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- –rm: 停止运行后该容器文件会被自动删除
- –volume , -v: 绑定一个卷
- –link=[]: 添加链接到另一个容器;
- –name=”nginx-lb”: 为容器指定一个名称;
- –env MYSQL_ROOT_PASSWORD=123456:向容器进程传入一个环境变量
MYSQL_ROOT_PASSWORD
,该变量会被用作 MySQL 的根密码。
star
启动容器服务,启动已经生成的容器文件,非run命令的创建
1
2 > $ bash container stop [containerID]
>
stop
前面的
docker container kill
命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop
命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。
1
2 > $ bash container stop [containerID]
>
这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。
logs
docker container logs
命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令查看输出。
1
2 > $ docker container logs [containerID]
>
exec
docker container exec
命令用于进入一个正在运行的 docker 容器。如果docker run
命令运行容器的时候,没有使用-it
参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。
cp
docker container cp
命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。
1
2 > $ docker container cp [containID]:[/path/to/file] .
>
以上Container详解引用自阮一峰老师,文末有他的文章链接,更加完整
Dockerfile详解
指令
- todo
多阶段构建
- todo