跳至主要內容

Docker安装-Windows

知识库容器技术DockerDockerWindows大约 9 分钟

window下安装docker

官方toolbox_install_windowsopen in new window下载docker toolboxopen in new window,链接地址:https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/open in new window

  1. 下载 DockerToolbox-18.06.0-ce.exe

    双击安装DockerToolbox-18.06.0-ce.exe,选好安装目录后,注意一点,windows已安装GIT,请不要勾上,然后一路next到完成。

  2. 复制boot2docker.iso镜像文件

    位于安装目录下(如C:\Program Files\Docker Toolbox),拷至C:\Users\Administrator.docker\machine\cache目录下
    如果没有.docker,尝试启动Quickstart Terminal,再关闭。

  3. 启动Quickstart Terminal ,等待完成初始化。成功后界面如下:

                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/

docker is configured to use the default machine with IP 192.168.99.100
For help getting started, check out the docs at https://docs.docker.com

Start interactive shell
  1. 大功告成 docker docsopen in new window

如果想要ssh链接, ssh docker@192.168.99.100 密码:tcuser

  1. 以下为可能遇到的问题
  • 启动quickstart,报错“正在查找bash.exe”

原因是之前装过了git程序,当前指向的bash.exe不存在,右键-》属性可见:将git/bash.exe改成实际的路径,即可

  • 界面长期处于下载 boot2docker.iso的状态

将boot2docker.iso文件,位于安装目录下(如C:\Program Files\Docker Toolbox),拷至C:\Users\Administrator.docker\machine\cache目录下,然后在网络断开的情况下重新启动,便可初始化成功。

  1. docker命令
docker ps -aq                     #列出所有容器ID
docker ps -a                      #查看所有运行或者不运行容器
docker stop $(docker ps -a -q)    #停止所有的container(容器),这样才能够删除其中的images:
docker stop $(docker ps -aq)
docker rm $(docker ps -a -q)      #删除所有container(容器)的话再加一个指令
docker rm $(docker ps -aq)
docker images                     #查看当前有些什么images
docker rmi <image id>             #删除images(镜像),通过image的id来指定删除谁
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")   #删除untagged images,也就是那些id为的image的话可以用
docker rmi $(docker images -q)    #删除全部image(镜像)
docker rmi -f $(docker images -q) #强制删除全部image

docker cp tomcat:/webapps/js/text.js /home/admin  #从容器到宿主机复制
docker cp 容器名:  容器路径             宿主机路径  

docker cp /home/admin/text.js tomcat:/webapps/js  #从宿主机到容器复制
docker cp 宿主路径中文件        容器名  容器路径  

docker container prune              #删除所有停止的容器
docker image prune --force --all    #删除所有不使用的镜像
docker image prune -f -a

docker stop Name或者ID              #停止一个容器
docker start Name或者ID             #启动一个容器
docker kill Name或者ID              #杀死一个容器
docker restart name或者ID           #重启一个容器

快速开始

安装完 Docker 之后,我们先打个实际项目的镜像,边学边用。

命令描述
FROM设置基础镜像,基于那个镜像来实现
MAINTAINER设置镜像作者
ENV声明环境变量
RUN执行命令
ADD添加宿主机文件到容器里,有需要解压的文件会自动解压
COPY添加宿主机文件到容器中,不会自动解压
WORKDIR设置RUN CMD ENTRYPOINT ADD COPY指令的工作目录
EXPOSE设置镜像暴露端口,记录容器启动时监听哪些端口
CMD容器启动后执行的命令,如果执行在docker run后面会被启动命令覆盖掉
ENTRYPOINT与CMD功能相同,但docker run不会覆盖,如果需要覆盖可添加参数-entrypoint来覆盖
VOLUME数据卷,将宿主机的目录映射到容器中(设置容器的挂载点)
USER设置RUN CMD ENTRYPOINT的用户名或UID
LABEL设置镜像的标签
  1. 新建项目

    为了快捷,我们直接使用 Vue 脚手架构建项目:

    vue create docker-demo
    cd docker-demo && npm run serve
    

    访问地址:http://localhost:8080/。open in new window

    需要注意:前端项目一般分两类,一类直接 Nginx 静态部署,一类需要启动 Node 服务。 我们选用Nginx 静态部署。

  2. 新建 dockerfile

    cd docker-demo && touch Dockerfile
    

    目录结构:

    -rw-r--r-- 1 zhang 197609     73  815 13:20 babel.config.js
    -rw-r--r-- 1 zhang 197609      0  815 13:46 Dockerfile
    drwxr-xr-x 1 zhang 197609      0  815 13:20 node_modules/
    -rw-r--r-- 1 zhang 197609    861  815 13:20 package.json
    -rw-r--r-- 1 zhang 197609 489405  815 13:20 package-lock.json
    drwxr-xr-x 1 zhang 197609      0  815 13:20 public/
    -rw-r--r-- 1 zhang 197609    323  815 13:20 README.md
    drwxr-xr-x 1 zhang 197609      0  815 13:20 src/
    
  3. 准备Nginx 镜像

拉取镜像

docker pull nginx

如果你出现这样的异常,请确认 Docker 实例是否正常运行。

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
镜像准备 OK,我们在根目录创建 Nginx 配置文件:

touch default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;
    error_log  /var/log/nginx/error.log  error;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
  1. 配置镜像

    打开 Dockerfile ,写入如下内容:

    FROM nginx
    COPY dist/ /usr/share/nginx/html/
    COPY default.conf /etc/nginx/conf.d/default.conf
    

    我们逐行解释一下代码:

    • FROM nginx 指定该镜像是基于 nginx:latest 镜像而构建的。
    • COPY dist/ /usr/share/nginx/html/ 命令的意思是将项目根目录下 dist 文件夹中的所有文件复制到镜像中 /usr/share/nginx/html/ 目录下。
    • COPY default.conf /etc/nginx/conf.d/default.conf 将 default.conf 复制到 etc/nginx/conf.d/default.conf,用本地的 default.conf 配置来替换 Nginx 镜像里的默认配置。
  2. 构建镜像

    Docker 通过 build 命令来构建镜像:

    npm run build
    docker build -t vue-demo .
    

    按照惯例,我们解释一下上述代码:

    • -t 参数给镜像命名 jartto-docker-demo。
    • . 是基于当前目录的 Dockerfile 来构建镜像。

    镜像制作成功!我们来查看一下容器:

    docker image ls | grep vue-demo
    
  3. 运行镜像

    docker run -d -p 3000:80 --name docker-vue vue-demo
    

    这里解释一下参数:

    • -d 设置容器在后台运行。
    • -p 表示端口映射,把本机的 3000 端口映射到 container 的 80 端口(这样外网就能通过本机的 3000 端口访问了)。
    • --name 设置容器名 docker-vue。
    • vue-demo 是我们上面构建的镜像名字。
  4. 访问镜像

    因为我们映射了本机 3000 端口,所以执行:

    curl -v -i localhost:3000
    

    或者打开浏览器,访问:localhost:3000。

    • Windows10下无法对docker容器进行端口访问

    原因:docker是运行在Linux上的,在Windows中运行docker,实际上还是在Windows下先安装了一个Linux环境,然后在这个系统中运行的docker。也就是说,服务中使用的localhost指的是这个Linux环境的地址,而不是我们的宿主环境Windows10。

    在docker命令行窗口执行

    docker-machine ip default
    

    Linux的ip地址,一般情况下这个地址是192.168.99.100

    然后在Windows的浏览器中,输入 http://ip:portopen in new window 即可启用:http://192.168.99.100:3000/open in new window

  5. 发布镜像

    如果你想为社区贡献力量,那么需要将镜像发布,方便其他开发者使用。

    dockerhubopen in new window

参数使用

FROM:
- 指定基础镜像,所有构建的镜像都必须有一个基础镜像,且 FROM 命令必须是 Dockerfile 的第一个命令
- FROM <image> [AS <name>] 指定从一个镜像构建起一个新的镜像名字
- FROM <image>[:<tag>] [AS <name>] 指定镜像的版本 Tag
- 示例:FROM mysql:5.0 AS database

MAINTAINER:
- 镜像维护人的信息
- MAINTAINER <name>
- 示例:MAINTAINER Jartto Jartto@qq.com

RUN:
- 构建镜像时要执行的命令
- RUN <command>
- 示例:RUN [executable, param1, param2]

ADD:
- 将本地的文件添加复制到容器中去,压缩包会解压,可以访问网络上的文件,会自动下载
- ADD <src> <dest>
- 示例:ADD *.js /app 添加 js 文件到容器中的 app 目录下

COPY:
- 功能和 ADD 一样,只是复制,不会解压或者下载文件

CMD:
- 启动容器后执行的命令,和 RUN 不一样,RUN 是在构建镜像是要运行的命令
- 当使用 docker run 运行容器的时候,这个可以在命令行被覆盖
- 示例:CMD [executable, param1, param2]

ENTRYPOINT:
- 也是执行命令,和 CMD 一样,只是这个命令不会被命令行覆盖
- ENTRYPOINT [executable, param1, param2]
- 示例:ENTRYPOINT [donnet, myapp.dll]

LABEL:为镜像添加元数据,key-value 形式
- LABEL <key>=<value> <key>=<value> ...
- 示例:LABEL version=1.0 description=这是一个web应用

ENV:设置环境变量,有些容器运行时会需要某些环境变量
- ENV <key> <value> 一次设置一个环境变量
- ENV <key>=<value> <key>=<value> <key>=<value> 设置多个环境变量
- 示例:ENV JAVA_HOME /usr/java1.8/

EXPOSE:暴露对外的端口(容器内部程序的端口,虽然会和宿主机的一样,但是其实是两个端口)
- EXPOSE <port>
- 示例:EXPOSE 80
- 容器运行时,需要用 -p 映射外部端口才能访问到容器内的端口

VOLUME:指定数据持久化的目录,官方语言叫做挂载
- VOLUME /var/log 指定容器中需要被挂载的目录,会把这个目录映射到宿主机的一个随机目录上,实现数据的持久化和同步
- VOLUME [/var/log,/var/test.....] 指定容器中多个需要被挂载的目录,会把这些目录映射到宿主机的多个随机目录上,实现数据的持久化和同步
- VOLUME /var/data var/log 指定容器中的 var/log 目录挂载到宿主机上的 /var/data 目录,这种形式可以手动指定宿主机上的目录

WORKDIR:设置工作目录,设置之后 ,RUN、CMD、COPY、ADD 的工作目录都会同步变更
- WORKDIR <path>
- 示例:WORKDIR /app/test

USER:指定运行命令时所使用的用户,为了安全和权限起见,根据要执行的命令选择不同用户
- USER <user>:[<group>]
- 示例:USER test

ARG:设置构建镜像是要传递的参数
- ARG <name>[=<value>]
- ARG name=sss

更多操作,请移步[官方使用文档](https://docs.docker.com/):[https://docs.docker.com/](https://docs.docker.com/)

总结

以下是在应用 Docker 过程中整理的最佳实践,请尽量遵循如下准则:

  • Require 明确:需要什么镜像。
  • 步骤精简:变化较少的 Step 优先。
  • 版本明确:镜像命名明确。
  • 说明文档:整个镜像打包步骤可以重现。

容器化技术必将是云时代不可或缺的技能之一,而 Docker 只是沧海一粟。随之而来的还有集群容器管理 Kubernetes、Service Mesh 、Istio 等技术。

打开 Docker 的大门,不断抽丝剥茧,逐层深入,你将感受到容器化的无穷魅力。