上篇文化在那个主要在 windows 下安装了Docker 并学习了官方的简单指导。接下里按照官方的 Documentation(https://docs.docker.com/docker-for-windows/) 来继续进行学习。
1 Hello World
(1)打开命令行终端
(2)查看 docker 安装版本
docker --version
docker -v
(3)拉取 hello-world 镜像 (image)
docker pull hello-world
docker run hello-world
可以直接运行 docker run hello-world 这样docker 首先会在本地查找该镜像文件,如果找不到就会到远程去查找(相当于会自动 先 pull 在 run )
(4) 查看当前所有的镜像
docker image ls
发现有许多镜像,有部分使我们没有去下载但是它自动出现的,是作为上篇文章中的 getting-started 镜像的依赖 一起下载下来的。
(5)查看所有容器
容器和镜像之间的关系相当于对象和类之间的关系。容器是镜像具体运行的一个进程,相当于镜像是模板,容器是镜像的一个实例。
docker container ls --all
(6)docker 的命令后可以加上 --help 来进行查看帮助文档
(7) 常用命令:
(a) 查看正在运行的容器
docker container ls
或
docker ps
(b)查看所有容器
docker container ls -a
或
docker ps -a
(c)停止容器/删除容器
docker stop containerid
docker rm containerid
(d)删除所有非活动的容器
docker rm -f $(docker ps -a | grep Exit | awk '{ print $1 }')
(e) 将容器打包成新的镜像
docker commit containerid imagename:tag
(f)将镜像导出到压缩包文件中
docker save -o filename imagename
docker save imagename| gzip > filename
或
docker save imagename >path.rar
(g)从文件(压缩包)中解压镜像
docker load --input filename
或
docker load < filename
2 进一步使用
(1)拉取 ubuntu 镜像
docker run --interactive --tty ubuntu bash
--interactive 则让容器的标准输入保持打开,--tty 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,bash 是表示进入那个ubuntu的镜像的容器的shell
查看 主机名 hostname
主机名和容器ID 绑定
退出 exit
(2)在 docker 中使用 Nginx 服务器
docker run --detach --publish 92:92 --name webserver nginx
上述命令也可以简写为
docker run -d -p 92:92 --name webserver nginx
成功启动,但是出现了和之前一样的问题,为啥本地端口不能成功访问。 官方教程中,说的是直接在浏览器中访问 http://localhost:92 即可访问到 nginx 对应的默认主页。
在经过查找资料后,得知,在 Windows 上运行 Docker 相当于先安装了一个 Linux 虚拟主机然后后在这个虚拟主机中使用 Docker ,所以 localhost 指的是虚拟主机的 Ip 而不是本机IP 。
因此我们需要获取虚拟主机的 IP 才能访问到该页面。具体可以参考另一篇文章(https://www.cnblogs.com/Assist/p/13530409.html)
处理之后,上次在使用gettingstarted 这个镜像是不能正常访问的问题也解决了。
3 自己制作 docker 容器
根据 koa-demos 来做为示例说明(参考链接 http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html)
首先通过 git 命令下载源码
git clone https://github.com/ruanyf/koa-demos.git cd koa-demos
(1)Dockerfile 文件
在项目的根目录下可以通过建立 .dockerignore 文件来忽略对应的文件或文件夹,这里该文件的具体内容为:
.git
node_modules
npm-debug.log
加下来建立 Dockerfile 文件
FROM node:8.4 COPY . /app WORKDIR /app RUN npm install --registry=https://registry.npm.taobao.org EXPOSE 3000
接下来对改文件进行说明:
(a)FROM node:8.4 代表基础镜像是 node:8.4,即意味着次镜像是从这个镜像基础上搭建的。
(b)COPY . /app 表示将当前目录拷贝到镜像的 /app 文件夹中
(c)WORKDIR /app 声明工作目录是 /app
(d)RUN npm install --registry=https://registry.npm.taobao.org 表示安装 npm ,RUN 命令要尽量少,能够用一句命令安装的尽量用一句命令完成
(e)EXPOSE 3000 表示 将容器的3000 窗口暴露出来
(f)其他常用参数:ARG、ENV、CMD
ARG:用法 ARG name ;在build docker image 的时候传值使用。docker build --build-arg name=value
ENV:ARG name value ;可以在 dockerfile 中使用也可以在 image 和 container 中使用
CMD:容器开启后执行对应命令;和 RUN 类似,但是 RUN 可以用多条 CMD 只能用一条,RUN 相当于打包东西进入 image 中,而 CMD 是在容器开启后执行。 指定了 CMD 命令以后,docker run
命令就不能附加命令了,否则会将 CMD 命令覆盖
(2)构建 image
docker image build -t koa-demo:0.0.1 .
(3) 查看
docker image ls
(4)发布 image 文件
(a)登录 dockerhub 账户
docker login
然后后会要求输入账号密码
(b)给镜像打标签
docker image tag [imageName] [username]/[repository]:[tag] docker image tag koa-demo:0.0.1 myname/koa-demo:0.0.1
也可以不重新打标签,而是重新构建一个镜像
docker image build -t [username]/[repository]:[tag] .
或
docker commit containerid [username]/[repository]:[tag]
(c) 提交镜像
docker image push [username]/[repository]:[tag]