版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/83796847
一.Docker架构和底层技术简介
1.Docker Platform
- Docker提供了一个开发,打包,运行app的平台
- 把app和底层infrastructure(physical/virtual物理设备和虚拟设备)隔离开来
2.Docker Engine
- 后台进程(dockerd)
- 提供REST API Server
- CLI 接口(docker)
3.Docker Architecture(Docker整体架构)
- Client(命令行中常用的命令)
- DOCKER_HOST
- image镜像
- containers容器
- Registry(存储镜像的公共服务器,用于images的存储与获取)
4.底层技术支持
- Namespaces:做隔离pid,net,ipc,mnt,uts
- Control groups:做资源限制(指定容器用多少内存)
- Union file systems:Container和image的分层
5.实验环境介绍
- 使用已经搭建好的实验环境【暂时还没有发布】
- 执行
vagrant up
命令开启centos7的虚拟机,这个虚拟机中已经安装好docker了 - 执行
vagrant ssh
登录centos虚拟机中
二.Docker image概述(Image即镜像)
1.什么是Image
- 文件和meta data的集合(root filesystem)
- 分层的,并且每一层都可以添加改变删除文件,成为一个新的image
- 不同的image可以共享相同的layer
- Image本身是read-only的
2.实例了解Image
- 执行
docker image ls
查看本地的所有image
3.Image的获取
-
通过Dockerfile格式的文件build出来对应的image(Build from Dockerfile)
-
从Registry拉取Image(Pull from Registry)
sudo docker pull ubuntu:14.04#从registry中拉取ubuntu14.04的image,不加版本号取的是最新版本 #上述拉取的方式是从docker hub中取出的,https://hubs.docker.com
- 上述拉取的方式是从docker hub中取出的,https://hubs.docker.com
- 如果不携带版本号的拉取,拿到的是最新版本
- 如果pull的内容带对应路径,如
sudo docker pull binami/wordpress
,该内容不是官方给提供的,其中binami为用户名;若想取官方image则需要执行sudo docker pull wordpress
三.DIY一个Base Image
1.提升docker命令的执行权限
#我们通常执行
#sudo docker image ls 查看docker中的image
#执行 docker image ls 会提示权限不足
#执行如下命令提升权限
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo service docker restart#重启docker服务
#使用vagrant ssh重新登录后,执行docker image ls可以直接查看结果
2.使用官方hello-world的image
docker pull hello-world#从registry中获得hello-world的baseimage,执行hello-world会创建一个容器
docker run hello-world#执行hello-world的container
3.通过c语言编写hello world,将hello wrold编译执行成二进制的可执行文件
-
执行
vim hello.c
创建hello.c -
编写hello.c
#include<stdio.h> int main() { printf('hello docker\n') }
-
编译c语言文件成二进制文件(编译c语言使用gcc)
#安装gcc sudo yum install gcc #安装glibc-static sudo yum install glibc-static #安装后执行如下命令进行编译c语言文件 gcc -static hello.c -o hello #此时我们将hello.c文件编译成名为hello的可执行文件 #可以使用./hello直接执行hello文件
-
编写Dockerfile文件
FROM scratch #表示当前image是base image ADD hello / #将hello运行到根目录中 CMD [~/hello~]
-
执行
docker build -t jack/hello-world .
构建Base image,最后的点表示在当前路径找Dockerfile -
通过dockerfile将此可执行文件打成docker image
-
使用
docker run jack/hello-world
执行创建的container,会打印hello docker
四.初识container
1.什么是Container
- 通过Image创建(copy)
- 在Image layer之上建立一个container layer(可读写)
- 类比面向对象:类(Image)和实例(Container)
- Image负责app的存储和分发,Container负责运行app
2.container命令
- docker container ls查看当前正在运行的container
- docker container ls -a查看所有的container(当前正在运行的和退出的)
- 如上述docker run jack/hello-world创建并运行container,运行后就会退出,故直接使用ls查看不到
- 若想创建后不退出则可以使用命令
docker run -it centos
,则会创建container并不会退出,直接使用ls可以查看到对应的contianer,相当于在image上多了一个layer - 执行
docker container rm ID号
即可将对应退出的container删除【使用docker rm ID号
默认移除的就是container】 - 执行
docker image rm ID号
即可移除image【使用docker rmi ID号
移除Image】 - 余下命令及参数请查阅相关文档
五.构建自己的Docker镜像
1.Docker命令
docker container commit Container名字 Image名字
[简写:docker commit Container名字 Image名字
]先基于某个image创建一个container,之后在container中做某些变化(如添加软件),之后将其commit成一个新的imagedocker image build
[简写:docker build
]通过Dockerfile创建一个image
2.Docker命令应用实例
- 场景一:
- 在image1中创建一个container,并安装vim
- 执行
docker commit...
将container变成image2【image2的大小比image1大,相当于填了一层并安装了vim】
- 场景二:
- 在image1中创建一个Dockerfile,内容如下
FROM centos #表示base image是centos RUN yum install -y vim #表示运行相关命令
- 通过
docker build -t Image名 .
会创建临时的container并安装vim,安装后会将container变成image并移除临时的container
- 在image1中创建一个Dockerfile,内容如下