本文仅以前端视角,接触使用 docekr。认识较为肤浅,大神请绕行。
关于 Docker
Docker 是啥
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。
Docker 主要用途
- 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
- 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
- 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。
以上摘自阮老师博客
Docker 中的概念
- 镜像(image): 镜像中包含有需要运行的文件。镜像用来创建 container,一个镜像可以运行多个 container;镜像可以通过 Dockerfile 创建,也可以从 Docker hub/registry 上下载。
- 容器(container): 容器是 Docker 的运行组件,启动一个镜像就是一个容器,容器是一个隔离环境,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。
- 仓库(repository): 共享和管理 Docker 镜像,用户可以上传或者下载上面的镜像,官方地址为 https://registry.hub.docker.com/(类似于 github 对源代码的管理),也可以搭建自己私有的 Docker registry。
以上摘自Ant Design Pro 的 Docker 部署方式
从我的角度,使用 docker 常常是要解决宿主依赖环境的问题。比如:
- 我是个前端开发从业者,可能有些时候需要在本地 查看 打包编译后的项目真实表现。以前需要本地安装一个 Nginx 配好文件,然后启动。现在,只需要编写好 dockerfile 文件,直接输入命令,就可以在本地查看项目。
- 再者,搭建较为复杂的环境(依赖因为网络等问题过于缓慢),不同开发者需要安装很多东西,不便捷。如,搭建一个 gitbook 文档项目(支持多个文档),从 nodejs ,gitbook, gitbookcli 等比较多的依赖全局安装后,还需要安装 gitbook 的插件(比较慢,而且还没有较快的国内镜像),才可本地启动。毕竟项目本身只是辅助编写文档,因为环境问题给团队带来困扰,就得不偿失了。 如果,将项目的依赖环境做成镜像,放到自己的内部服务器上,每个需要启动项目的人直接使用 docker 镜像,那么基本无痛启动项目。
安装
安装系统推荐使用 Mac 或者 Linux。
Windows 不建议使用。《菜鸟教程》的 Docker Windows 安装中说的 Docker toolbox(老黄历) 已经无法使用了。官方推荐 安装 Docker desktop,需要系统是专业版的。(而且折腾一番,及时能用,跑别人写的 Dockerfile 还会碰到问题。过于折腾,本末倒置。)
Mac 或 Windows 安装软件地址
安装教程:
Mac 安装
ubuntu 安装
Windows 安装
1 2 3 4 5 6 7
| docker version
sudo usermod -aG docker $USER
docker run --detach --publish=80:80 --name=webserver nginx
|
慢?!修改镜像源地址
Docker 修改镜像源地址
如果是 dockerDesktop 进入设置,找到 Daemon 选项,修改 registry-mirrors 选项为:'http://hub-mirror.c.163.com’ [这个是网易的加速镜像],然后 apply && start
insecure registry 一般 是公司搭建的私服使用
基本操作
镜像操作
检索拉取镜像
1 2 3 4
| docker search <Images Name>
docker pull <Images Name:tag-缺省为latest>
|
非官方下载 需要加上 仓库地址。
如从网易蜂巢的镜像源来下载 ubuntu:18.04 镜像,可以使用如下命令,此时下载的镜像名称为 hub.c.163.com/public/ubuntu:18.04
新增 镜像
1 2 3 4 5 6 7 8
|
docker commit [OPTIONS] CONTAINER [镜像名称[:TAG]]
docker commit -m'提交消息' -a '作者' <容器ID> <Images Name:tag>
|
1 2 3 4 5 6
|
docker import [OPTIONS] file|URL|- <Images Name:tag>
cat exampleimage.tgz | docker import - exampleimagelocal:new
|
1 2 3 4 5 6 7 8 9 10
|
docker build [OPTIONS] <Dockerfile的 PATH | URL | - >
docker build github.com/creack/docker-firefox
docker build -t lanjiang/gitbook .
|
删除 镜像
1 2 3 4 5 6
| docker rmi [-f: 强制删除] <Images Name/ids>
docker rmi $(docker images | grep "none" | awk '{print $3}')
docker rmi $(docker images -a -q)
|
- docker image prune 清除没有被使用的镜像
1 2 3 4 5 6
|
docker image prune [OPTIONS]
|
修改 镜像 名称
1 2
| docekr tag <Images Name/id> <new Images Name>
|
查看 镜像
1 2 3 4 5
| docker images / docker image ls
docker images -a
|
导入、导出、上传 镜像
1 2 3 4 5 6
| docker save -o <导出名称> <Images Name:tag>
docker save -o /Users/mcdowell/Downloads/dockderApp.tar node
docker save node > /Users/mcdowell/Downloads/dockderApp11.tar
|
1 2 3 4
| docker load -i /Users/mcdowell/Downloads/tf-keras.tar
docker load < /Users/mcdowell/Downloads/tf-keras.tar
|
1 2
| docker push [OPTIONS] NAME[:TAG]
|
1 2 3 4 5 6 7 8 9
|
docker commit c16378f943fe rhel-httpd
docker tag rhel-httpd registry-host:5000/myadmin/rhel-httpd
docker push registry-host:5000/myadmin/rhel-httpd
docker push myadmin/rhel-httpd
|
容器操作
新增容器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| docker create <Images Name:version /ID>
docker run [OPTIONS] <Images Name:version> [COMMAND] [ARG...]
docker run -it node bash
docker run -it ubuntu:18.04 /bin/bash
docker run -p 80:80 lanjiang/gitbook
docker run -d -p 80:80 nginx
docker run -P -d --name mynginx nginx:latest
|
删除 容器
1 2 3 4 5 6 7
| docker rm <IDs>
docker rm $(docker ps -a|grep gitbook|awk '{print $1}')
docker rm $(docker ps -a -q)
|
- docker container prune 删除
1 2 3 4 5
|
docker container prune [OPTIONS]
|
修改 容器 状态
1 2 3 4 5
| docker start <Images Name:version /ID>
docker restart <ID>
|
1 2 3 4
| docker pause <ID>
docker unpause <ID>
|
1 2 3 4
| docker stop <IDs>
docker stop $(docker ps -a|grep gitbook|awk '{print $1}')
|
进入 容器
1 2 3 4 5
| docker attach [OPTIONS] <container Name/ID>
docker attach --sig-proxy=false mynginx
|
1 2 3 4 5 6 7 8 9 10 11
|
docker exec [OPTIONS] <container Name/ID> [命令] [ARG...]
docker exec -it mynginx /bin/sh /root/blue.sh
docker exec -it <container Name/ID> /bin/bash
|
查看 容器
1 2 3 4 5 6 7
| docker logs <ID>
docker ps
docker ps -a
|
1 2 3 4 5 6 7 8 9 10 11 12
| docker inspect <container Name/ID>
docker top <container Name/ID>
docker stats <container Name/ID>
docker diff <container Name/ID>
docker port <container Name/ID>
|
器与主机之间的数据拷贝
1 2 3 4 5 6 7 8
| docker cp <path> <path>
docker cp /www/blue 63d47d7c0d4c:/www/
docker cp /www/blue 63d47d7c0d4c:/www
docker cp 63d47d7c0d4c:/www /tmp/
|
导入、导出 容器
1 2 3 4 5 6
| docker export -o tf-keras-33f6c8359187.tar <container Name/ID>
docker export 33f6c8359187 > tf-keras-33f6c8359187.tar
docker import tf-keras-33f6c8359187.tar
|
与镜像导出(docker save)比较:
容器快照文件 将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大