Docker安装-Windows
window下安装docker
官方toolbox_install_windows,下载docker toolbox,链接地址:https://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
下载 DockerToolbox-18.06.0-ce.exe
双击安装DockerToolbox-18.06.0-ce.exe,选好安装目录后,注意一点,windows已安装GIT,请不要勾上,然后一路next到完成。
复制boot2docker.iso镜像文件
位于安装目录下(如C:\Program Files\Docker Toolbox),拷至C:\Users\Administrator.docker\machine\cache目录下 如果没有.docker,尝试启动Quickstart Terminal,再关闭。
启动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
- 大功告成 docker docs
如果想要ssh链接, ssh docker@192.168.99.100 密码:tcuser
- 以下为可能遇到的问题
- 启动quickstart,报错“正在查找bash.exe”
原因是之前装过了git程序,当前指向的bash.exe不存在,右键-》属性可见:将git/bash.exe改成实际的路径,即可
- 界面长期处于下载 boot2docker.iso的状态
将boot2docker.iso文件,位于安装目录下(如C:\Program Files\Docker Toolbox),拷至C:\Users\Administrator.docker\machine\cache目录下,然后在网络断开的情况下重新启动,便可初始化成功。
- 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 | 设置镜像的标签 |
新建项目
为了快捷,我们直接使用 Vue 脚手架构建项目:
vue create docker-demo cd docker-demo && npm run serve
需要注意:前端项目一般分两类,一类直接 Nginx 静态部署,一类需要启动 Node 服务。 我们选用Nginx 静态部署。
新建 dockerfile
cd docker-demo && touch Dockerfile
目录结构:
-rw-r--r-- 1 zhang 197609 73 8月 15 13:20 babel.config.js -rw-r--r-- 1 zhang 197609 0 8月 15 13:46 Dockerfile drwxr-xr-x 1 zhang 197609 0 8月 15 13:20 node_modules/ -rw-r--r-- 1 zhang 197609 861 8月 15 13:20 package.json -rw-r--r-- 1 zhang 197609 489405 8月 15 13:20 package-lock.json drwxr-xr-x 1 zhang 197609 0 8月 15 13:20 public/ -rw-r--r-- 1 zhang 197609 323 8月 15 13:20 README.md drwxr-xr-x 1 zhang 197609 0 8月 15 13:20 src/
准备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;
}
}
配置镜像
打开 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 镜像里的默认配置。
构建镜像
Docker 通过 build 命令来构建镜像:
npm run build docker build -t vue-demo .
按照惯例,我们解释一下上述代码:
- -t 参数给镜像命名 jartto-docker-demo。
- . 是基于当前目录的 Dockerfile 来构建镜像。
镜像制作成功!我们来查看一下容器:
docker image ls | grep vue-demo
运行镜像
docker run -d -p 3000:80 --name docker-vue vue-demo
这里解释一下参数:
- -d 设置容器在后台运行。
- -p 表示端口映射,把本机的 3000 端口映射到 container 的 80 端口(这样外网就能通过本机的 3000 端口访问了)。
- --name 设置容器名 docker-vue。
- vue-demo 是我们上面构建的镜像名字。
访问镜像
因为我们映射了本机 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:port 即可启用:http://192.168.99.100:3000/
发布镜像
如果你想为社区贡献力量,那么需要将镜像发布,方便其他开发者使用。
参数使用
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 的大门,不断抽丝剥茧,逐层深入,你将感受到容器化的无穷魅力。