1、Docker 扫盲
1.1、Docker是干嘛的
软件开发最大的麻烦事之一,就是环境配置。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。而且换一台机器,就要重来一次。Docker可以解决这个问题
1.2、Docker 是什麽
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。容器是进程级别的,相比虚拟机有很多优势:(1)启动快;(2)资源占用少(3)体积小。
Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
1.3、Docker 怎么玩儿
- 安装
参考这里 - 启动
// 确保安装成功
docker version
// 启动 docker
sudo systemctl start docker
// 将当前用户加入docker用户组,避免每次要输入 sudo
sudo groupadd docker
sudo usermod -aG docker $USER
1.4、Docker 基本概念
- Image(镜像)文件
1、Docker 把 应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。
2、image 文件可以看作是容器的模板,Docker 根据 image 文件生成容器的实例。
3、同一个 image 文件,可以生成多个同时运行的容器实例。
4、image 文件是通用的,一台机器的 image 文件拷贝到另一台机器,照样可以使用
5、Docker 的官方仓库 Docker Hub 是最重要、最常用的 image 仓库
# 列出本机的所有 image 文件
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
- Container(容器)文件
1、image 文件生成的容器实例,本身也是一个文件,称为容器文件。
2、一旦容器生成,就会同时存在两个文件: image 文件和容器文件。而且关闭容器并不会删除容器文件,只是容器停止运行而已。
3、终止运行的容器文件,依然会占据硬盘空间,可以使用docker container rm
命令删除
// 拉取 镜像文件
docker image pull hello-world
// 基于镜像文件生成容器文件,每次都会生成一个新的容器文件
docker container run hello-world
// 基于容器文件生成容器,可以复用存在的容器文件
docker container start [containerID]
// 列出本机正在运行的容器,会包含containID信息
$ docker container ls
// 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
// 停止某个容器,不会删除容器文件
docker container kill [containID]
// 移除某个容器,删除容器文件
docker container rm [containerID]
// 从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法
docker container cp [containID]:[/path/to/file] .
1.5、docker 的可视化工具
2、Docker 进阶
本小节介绍如何制作 image 文件,以及 docker 的一些高级用法
2.1、制作 image
主要是编写 Dockerfile 文件,此外用.dockerignore文件排除不想打包的文件。Dockerfile 文件它是一个文本文件,用来配置 image。Docker 根据 该文件生成二进制的 image 文件。
// Dockerfile 文件示例
FROM node:8.4 // 该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node
COPY . /app // 将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录
WORKDIR /app 指定接下来的工作路径为/app
RUN npm install --registry=https:\/\gistry.npm.taobao.org //在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000 // 将容器 3000 端口暴露出来, 允许外部连接这个端口。
CMD node demos/01.js // 容器启动后自动执行 node demos/01.js
然后执行docker image build -t 容器名称 .
即可构建一个 image
2.2、微服务架构
微服务很适合用 Docker 容器实现,每个容器承载一个服务。一台计算机同时运行多个容器,从而就能很轻松地模拟出复杂的微服务架构。如何管理这多个容器呢,即一行命令同时启动或关闭多个容器。Docker Compose可以做到。你需要定义一个 YAML 格式的配置文件docker-compose.yml
,写好多个容器之间的调用关系。
// 一个 docker-compose.yml 示例
mysql: // 容器名称
image: mysql:5.7 // 镜像名称
environment:
- MYSQL_ROOT_PASSWORD=123456 // 所需的环境变量
- MYSQL_DATABASE=wordpress
web:
image: wordpress
links: // 需要链接到 mysql 容器
- mysql
environment:
- WORDPRESS_DB_PASSWORD=123456
ports:
- "127.0.0.3:8080:80"
working_dir: /var/www/html
volumes: // 将当前目录内容 映射到容器的 /var/www/html 目录
- wordpress:/var/www/html
docker-compose up // 启动
docker-compose stop // 关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。
docker-compose rm // 把这两个容器文件删除
3、Docker 日常用法
以下两种玩儿发都需要配置国内镜像代理,否则速度极慢,代理配置参考注https://www.daocloud.io/mirror#accelerator-doc
- 命令行玩法
// 启动容器相关
docker container run -p 8000:3000 -it koa-demo /bin/bash // 容器的 3000 端口映射到本机的 8000 端口;容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器;容器启动以后,内部第一个执行的命令
docker container ls // 查出容器的 ID
docker container kill [containerID] // 停止容器,容器停止运行之后,并不会消失
docker container rm [containerID] // 删除容器,释放存储空间
docker container run --rm -p 8000:3000 -it koa-demo /bin/bash // --rm 会在容器停止后自动删除容器
docker container start [containerID] // docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件
// 镜像构建相关
docker image build -t koa-demo:0.0.1 . // 创建镜像文件
docker image tag [imageName] [username]/[repository]:[tag] // 给镜像文件打 tag
docker image push [username]/[repository]:[tag] // 发布
- 可视化玩法
安装 kitematic 客户端,可通过可视化方式启动容器,注意启动容器后,如果想进一步写shell 命令,则需要用到以下命令:
docker container exec -it [containerID] /bin/bash
网友评论