shownb / shownb.github.com

shownb.github.io
shownb.github.io
5 stars 1 forks source link

docker入门。 #31

Open shownb opened 5 years ago

shownb commented 5 years ago

docker简单原理

docker 容器有自己的kernel吗

没有,docker和宿主机共享kernel

docker的kernel version由镜像确定还是由宿主机确定

由宿主机决定

image 相当于类 container相当于实例 image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。

源安装

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates
sudo apt-get install software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg|sudo apt-key add -
sudo apt-key fingerprint 0EBFC88
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo usermod -aG docker zero

手动安装

到 https://download.docker.com/linux/ubuntu/dists/, 选择你的发行版 再到这个目录 pool/stable/ 下载 amd64, arm64, armhf, ppc64el, or s390x. 下载你想要的docker的版本的.deb文件
sudo dpkg -i /path/to/package.deb
# 列出本机的所有 image 文件。
$ docker image ls
# 删除 image 文件
$ docker image rm [imageName]
# 列出本机正在运行的容器
$ docker container ls

# 列出本机所有容器,包括终止运行的容器
$ docker container ls --all
$ docker container run -p 8000:3000 -it koa-demo /bin/bash

每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。

参数解析 -d:以守护进程方式运行(后台)。 -i:表示以“交互模式”运行容器 -t:表示容器启动后会进入其命令行 -v:容器挂载目录,-v /my/webapp:/usr/local/tomcat/webapps,冒号前为当前宿主机目录,冒号后为容器目录。数据卷的挂载是通过把本地的目录覆盖到容器中的。也就是说,当宿主机文件不存在时,不能挂载;当文件夹不存在时,挂载到容器会用一个空文件夹覆盖容器原有目录。 --expose=[]: 开放一个端口或一组端口; --rm:停止运行后,自动删除容器文件。 --name="scratch3.0": 为容器指定一个名称; 记得使用,不然你以后看container id看到头痛 --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致; --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致; -h "mars": 指定容器的hostname; -e username="ritchie": 设置环境变量; --env-file=[]: 从指定文件读入环境变量 --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型; --link=[]: 添加链接到另一个容器;

要改容器里面的内容,通过挂载的话,你没有原始数据,先把容器的内容拷贝出来,再挂载。

制作镜像image Dockerfile文件内容

FROM node:carbon

# 创建 app 目录
WORKDIR /app

# 安装 app 依赖
# RUN npm -g install serve

# 使用通配符复制 package.json 与 package-lock.json
COPY package*.json ./

RUN npm install

# 打包 app 源码
COPY src /app

# 如需对 react/vue/angular 打包,生成静态文件,使用:
# RUN npm run build

EXPOSE 8080
# 如需部署静态文件,使用:
#CMD ["serve", "-s", "dist", "-p", "8080"]
CMD [ "node", "server.js" ]

.dockerignore文件内容,这个是用来忽略文件里面的目录或者文件,不要拷进image

.git
node_modules
npm-debug
# ${your_name} 可以省略
# ${tag} 省略时为 latest
docker build -t ${your_name}/${image_name}:${tag} .
​
# 省略版本
docker build -t ${image_name} .

再举例子 一个scrach 3的docker Dockerfile文件 来自 https://github.com/leejoneshane/docker-scratch3/blob/master/Dockerfile

FROM node:alpine
#alpine Docker 镜像也继承了 Alpine Linux 发行版的优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右
RUN apk add --no-cache git  \
    && mkdir -p /usr/src/app \
    && cd /usr/src/app \
    && git clone https://github.com/LLK/scratch-gui.git \
    && cd scratch-gui \
    && npm install \
    && sed -ri -e "s/8601/80,\n disableHostCheck: true/" ./webpack.config.js
WORKDIR /usr/src/app/scratch-gui
EXPOSE 80
CMD ["npm","start"]

docker中宿主机与容器互相拷贝文件 需要注意的是,不管容器有没有启动,拷贝命令都会生效。

docker cp [containID]:[/path/to/容器文件] /opt/宿主机/

进入一个正在运行的 docker 容器。

docker container exec -it [containerID] /bin/bash

进阶 共有两种 Volume 类型。每种 Volume 都是主机目录树的一个位置对应到容器内的目录树上的一个挂载点,其不同只在于主机上的位置。 第 1 种叫绑定挂载的 Volume (bind mount volume):用户指定将主机上的某个目录或文件挂载到容器中的目录树上。 第 2 种叫受管理的 Volume (managed volume):所使用的主机上的位置是由 Docker daemon 创建并管理的,这些位置称为 Docker managed space。-v 没有指定主机位置,这就创建了一个 Docker-managed volume。如果要找出这个 Volume 绑定到主机上的确切哪个位置,可以用 docker inspect 命令:docker inspect -f "" project 下面的,第一个代码块里面的就是一个受管理volume,第二个代码块就是bind mount volume

docker run -itd -v C:\Repo\project:/project -v node_modules:/project/node_modules --name project node:alpine

Tips 注意Dockerfile里面的CMD 如果在容器运行的时候-it的话,是会给覆盖的。

docker 容器(服务)重命名:

docker rename 原容器名 新容器名

启动一个容器

docker start 容器名或者容器id

参考 利用Docker容器搭建高效的Node.js开发环境 https://yalishizhude.github.io/2017/08/10/docker4node/ Docker 中通过 Volume 实现持久化存储和数据共享 http://www.atjiang.com/persistent-storage-and-shared-state-with-volumes-in-docker/

shownb commented 5 years ago
docker build -t scratch3 .
docker images
docker container ls --all
docker container run --name s3 -p 80:80 -it scratch3 /bin/sh
docker container run --name s3 --rm -p 80:80 -it scratch3 /bin/sh
docker container start [containerID]
docker container exec -it [containerID] /bin/sh