Open shownb opened 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
docker简单原理
docker 容器有自己的kernel吗
没有,docker和宿主机共享kernel
docker的kernel version由镜像确定还是由宿主机确定
由宿主机决定
image 相当于类 container相当于实例 image 是二进制文件。实际开发中,一个 image 文件往往通过继承另一个 image 文件,加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入 Apache 服务器,形成你的 image。
源安装
手动安装
每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用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文件内容
.dockerignore文件内容,这个是用来忽略文件里面的目录或者文件,不要拷进image
再举例子 一个scrach 3的docker Dockerfile文件 来自 https://github.com/leejoneshane/docker-scratch3/blob/master/Dockerfile
docker中宿主机与容器互相拷贝文件 需要注意的是,不管容器有没有启动,拷贝命令都会生效。
进入一个正在运行的 docker 容器。
进阶 共有两种 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
共享数据方法一 先创建一个随带 Volume 的容器,这种定义了 Volume 的容器叫 volume container:
然后创建容器时通过 --volumes-from 实现与缓存容器共享 /project/node_modules。
再随便在这个name为project的容器里面安装个modules
共享数据方法二 创建一个Docker volume用来共享容器间的数据。
Tips 注意Dockerfile里面的CMD 如果在容器运行的时候-it的话,是会给覆盖的。
docker 容器(服务)重命名:
启动一个容器
参考 利用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/