之前一直知道docker这个东西,也没有深入去研究,今天粗略学了下,写下来记录
理解:
docker可以看做一种方便打包部署的方式?例如你指定了node版本是8.0,当你把你的代码打包成镜像之后,把镜像发给部署的人,部署的人在服务器中导入镜像,跑起来成为容器的时候,会自动下载node的版本,就不用配置node环境了。
docker中有三个重要的概念:镜像 容器 仓库
镜像呢,就像是一个class类;容器就像是一个实例;仓库就是放镜像的地方;
这个仓库目前有hub.docker.com 或者阿里的仓库;当你打包了镜像怎么传给别人呢,有两种方式,一种是将镜像上传到上述其中的仓库,然后让别人下载后运行;另一种方式就是将镜像导出成压缩文件,别人就能通过导入的方式导入镜像。上传到仓库的过程有点像发布npm包的过程。
学习docker我参考了两个文章:
https://juejin.cn/post/6844903918372143112
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
更加推荐下面的阮一峰教程,说的更通俗易懂一点吧
结尾附上我得有道云笔记,一些API使用
1、打印docker版本
docker version
2、拉取镜像 默认从docker官方提供的镜像仓库服务
docker pull hello-world
3、配置docker的源为阿里的
"registry-mirrors": ["dftbcros.mirror.aliyuncs.com"],
4、查看镜像列表
docker images
5、使用hello-world运行一个容器
docker run hello-world
docker container run hello-world
docker container run命令会从 image 文件,生成一个正在运行的容器实例。
注意,docker container run命令具有自动抓取 image 文件的功能。如果发现本地没有指定的 image 文件,就会从仓库自动抓取。因此,前面的docker image pull命令并不是必需的步骤。
6、拉取一个centos镜像
docker pull centos
docker pull library/centos:latest
上面使用centos,那是因为省略作者名,则作者名library,表示Docker官方的镜像
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
拉取一个镜像,需要指定Docker Registry的地址和端口号,默认是Docker Hub,还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,另外,仓库名则由作者名和软件名组成
7、运行镜像 可以通过镜像创建一个容器
docker run 镜像名称
8、删除镜像
如果有使用该镜像创建的容器未删除,则不允许删除镜像
dockere image rm image_name/image_id
docker rmi image_name/image_id
9、看所有正在运行容器
docker ps -a
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
–format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
–no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
10、删除容器
docker rm 容器id
11、停止容器
docker stop container_id
对于那些不会自动终止的容器,必须使用docker container kill 命令手动终止
手动终止还会占用硬盘,可以用rm删除
12、创建镜像
(1)新建一个文本文件.dockerignore
内容:
.git node_modules npm-debug.log
(2)创建文本文件 Dockerfile
内容:
FROM node:8.4 COPY . /app WORKDIR /app RUN npm install --registry=https://registry.npm.taobao.org EXPOSE 3000
CMD node demos/01.js
FROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app:指定接下来的工作路径为/app。
RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
CMD node demos/01.js,它表示容器启动后自动执行node demos/01.js
RUN命令与CMD命令的区别在哪里?
简单说,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;
CMD命令则是在容器启动后执行。
另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
注意,指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否则它会覆盖CMD命令
(3)命令创建image文件 -t指定image名字
最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。
docker image build -t koa-demo . 或者 docker image build -t koa-demo:0.0.1 .
docker build -t koa-demo .
13、生成容器
docker container run命令会从 image 文件生成容器。
docker container run -p 8000:3000 -it koa-demo /bin/bash 或者 docker container run -p 8000:3000 -it koa-demo:0.0.1 /bin/bash
上面命令的各个参数含义如下:
-p参数:容器的 3000 端口映射到本机的 8000 端口。
-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。
/bin/bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
如果一切正常,运行上面的命令以后,就会返回一个命令行提示符。 root@66d80f4aaf1e:/app#
这表示你已经在容器里面了,返回的提示符就是容器内部的 Shell 提示符。执行下面的命令。 root@66d80f4aaf1e:/app# node demos/01.js
14、发布image文件
(1)hub.docker.com 或 cloud.docker.com 注册一个账户 docker login登录
(2)为本地的 image 标注用户名和版本。
docker image tag [imageName] [username]/[repository]:[tag] # 实例 docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
也可以不标注用户名,重新构建一下 image 文件。 docker image build -t [username]/[repository]:[tag] .
最后,发布 image 文件。 $ docker image push [username]/[repository]:[tag]
15、导出镜像
docker save -o koa-demo.tar koa-demo
16、导入镜像
docker load -i nginx.tar