docker

关于docker的介绍以及初级使用 在各个网上都能搜到了

记录一下个人的使用了两天后的感受

  1. 首先可以去看看知乎的评价 以及知乎上说的关于docker的使用场景

  2. 目前还是没有感觉出和server 虚拟机的差别, 很明显的就是 它能直接通过内部命令去搜和下载以及安装运行,而虚拟机需要去找找找

  3. 因为本身我的host也是linux而且还是基于ubuntu的mint,所以我看到很多应用 感觉都直接可以安装,从这一点上说对个人用户没有看出特别的优点

  4. 目前所想到的优点,以及搜索到的一些repo:如果本身使用的不是debian系列的linux 甚至是windows,那么有一个docker能快速部署和支持想想也是很棒的,当然现在windows 也推出了ubuntu on windows

  5. 个人每次换新电脑的时候 还是要配本地环境,感觉优势不明显,但比如一些常用的需要配置的仓库,别人已经搭好了就能直接pull

  6. 还没学会如何精简的使用docker+github 来作为个人性质的使用 _(:з」∠)_或者这种姿势本身就是不正确的?

  7. 以及 它和虚拟机相比 可以说把 整个系统当做一个仓库来管理,因此 可以更快”建立”虚拟机 用来运行一些需要隔离的程序

架构

architecture

components

docker command

docker state

https://docs.docker.com/engine/faq/

常用

docker pull

docker build

docker push

docker run

run

--rm 运行后删除自己,可以把数据类映射到宿主机上,运行的container只是当作个程序

--env 运行环境参数

但凡会输入--help命令就能看到-d-d, --detach Run container in background and print container ID 还有一堆人非要说是daemon

--link <container name or id>:<alias name> # https://www.jianshu.com/p/21d66ca6115e

权限

方案1 sudo启动

方案2 创建docker用户组

1
2
3
4
sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker ps #测试docker命令是否可以使用sudo正常使用

运行

1
2
3
4
5
6
7
8
docker run --name 容器名 -i -t -p 主机端口:容器端口 -d -v 主机目录:容器目录:ro 镜像TD或镜像名:TAG

# --name 指定容器名,可自定义,不指定自动命名
# -i 以交互模式运行容器
# -t 分配一个伪终端,即命令行,通常组合来使用
# -p 指定映射端口,将主机端口映射到容器内的端口
# -d 后台运行容器
# -v 指定挂载主机目录到容器目录,默认为rw读写模式,ro表示只读

映射:冒号左侧宿主docker提供,右侧docker内部

创建

流程

docker hub 仓库,拉取到本地images

images 生成可运行的container

container 执行具体任务

docker image inspect <image name> 看配置

多个docker 之间配置 一次使用

docker-compose.yml文件 + 相关配置文件

1
2
3
4
5
6
# 启动所有服务
docker-compose up
# 关闭所有服务
docker-compose stop
# 删除所有
docker-compose rm

Dockerfile 创建image Demo

index.js

1
2
3
var os = require("os");
var hostname = os.hostname();
console.log("hello from " + hostname);

Dockerfile

1
2
3
4
5
6
FROM alpine
RUN apk update && apk add nodejs
COPY . /app
WORKDIR /app
EXPOSE 3000
CMD ["node","index.js"]

docker image build -t hello:v0.1 .

相关命令

  • 基础镜像(父镜像)信息指令 FROM。
  • 维护者信息指令 MAINTAINER。
  • 镜像操作指令 RUN 、EVN 、ADD、 WORKDIR、EXPOSE 等。
    COPY 从宿主到内部
  • 容器启动指令 CMD 、ENTRYPOINT 和 USER 等。
    CMD 内部执行的命令 推荐上面数组格式
    ENTRYPOINT 可以让你的容器表现得像一个可执行程序一样。

使用多个container (swarm mode)

Docker Compose and Docker Swarm Mode

Compose用于控制单个系统上的多个容器。 就像我们用来构建映像的Dockerfile一样,有一个文本文件描述了应用程序:要使用的映像,多少实例,网络连接等。但是Compose仅在单个系统上运行,因此虽然有用 ,我们将跳过Compose1并直接进入Docker Swarm Mode。

Swarm Mode 告诉Docker您将运行许多Docker引擎,并且您希望协调所有引擎。 Swarm模式结合了以下功能:不仅可以定义应用程序体系结构(例如Compose),而且可以定义和维护高可用性级别,扩展,负载平衡等。 通过所有这些功能,Swarm模式在生产环境中的使用频率要比其简单的表亲Compose更高。

https://training.play-with-docker.com/ops-s1-swarm-intro/

常用

这些并不会随着container消失而清理,可能需要手动rm,

docker network ls 管理网络配置

docker volume ls 储存

安全

对于宿主机器的权限https://training.play-with-docker.com/security-seccomp

常用 cheat sheet

功能 命令
比较container和images本身的区别 docker container diff <container_id>
基于container创建image docker container commit <container_id>
命名image的repo docker image tag <image_id> <image_repository>
基于dockerfile创建image docker image build -t <image_repository> .
导出容器 docker export <container_id> > xxx.tar
导入容器 cat xxx.tar <管道符号> docker import - <repository>:<tag>
标准输出日志查看 docker logs -f <container_id> / docker container logs <container_id>
进入正在运行的容器(不建议经常操作,如果经常改,应该映射出来) docker container exec -it <container_id> /bin/bash

发布到远端

登录

docker login

产生image

docker image build -t [username]/[repository]:[tag] .

推送

docker image push [username]/[repository]:[tag]

磁盘体积过大

比如我的一个128ssd+1t普通的电脑,分区大概是/,/home,/data, 然后这个玩意占了8g多/,忍不了

很多办法 https://github.com/moby/moby/issues/3127 , 官网是建议

/etc/docker/daemon.json

1
2
3
4
{
"data-root": "/data/docker",
"storage-driver": "overlay2"
}

记得先停再操作

ref

training play with docker