docker
introduce
- 虚拟机相比 docker 的缺点:1)占空间大 2)启动慢
- 容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。docker 就是一种容器技术
- docker 将程序以及程序所有的依赖都打包到 docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。
操作系统 - 港口
软件运行的环境(所需要的依赖等) - 集装箱
main
-
dockerfile -> image -> container
-
那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。
-
docker pull [仓库地址/仓库名称/镜像名称] // 仓库地址默认为官方仓库地址 仓库名字默认为 library
-
docker pull [镜像名字] // 官方镜像仓库中拉取
-
docker pull hub.c.163.com/library/mysql:latest
-
docker pull xunmi/django
-
docker pull ubuntu
-
docker images
-
docker images rm [镜像名字或镜像id] // 删除一个
-
docker images rmi [镜像名字或镜像id] // 删除多个
-
docker build -t [镜像名字] // 根据 dockerfile 创建一个叫做[镜像名字]的镜像
-
docker run -rm -d -p [主机端口]:[容器端口] [镜像名字] --name [容器名字,不可以为中文]// -rm 当容器停止运行后删除该容器 -d 容器在后台运行
-
docker ps -a // -a 所有容器
// 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等) -
docker ps -f name=指定的名字
-
docker start [容器名或容器id]
-
docker kill [容器名或容器id] // kill stop 作用差不多都是关闭
-
docker stop [容器名或容器id]
-
docker rm [容器名或容器id]
-
docker rmi [镜像名字或镜像id]
-
docker tag [镜像名] [镜像名2] // 以 镜像名 复制出一个叫做 镜像名2 的镜像
// 容器开启后需要在前台运行或者通过命令才能执行命令
dockerfile
RUN、CMD、ENTRYPOINT :RUN 是在构建镜像阶段运行的,CMD、ENTRYPOINT 是在运行时候执行的。CMD 的参数会给到 ENTRYPOINT 参数 ;若 dockerfile 中存在多个 CMD 则取最后一个,ENTRYPOINT 同理
// dockerfile 内容:
FROM ubuntu // 基于 ubuntu 镜像
MAINTAINER ashley // 维护者
RUN sed -i 's/archive.ubuntu.com/mirros.ustc.edu.cn/g' /etc/apt/sources.list // 加速
RUN apt-get update // 更新库
RUN apt-get install nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx","-g","daemon off"] // nginx 在前台执行
EXPOSE 80
// 执行
vi index.html
// 基于 dockerfile 创建一个镜像;. 是因为 docker 是 c/s 架构, 主机是 c ,docker 是 s,实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。比如上面的 `COPY index.html /var/www/html`
docker build -t ashley/nignx .
docker run -d -p 80:80 ashley/nginx
VOLUMN
docker run -name nginx1 -v /usr/share/nginx/html -p 80:80 nginx // -v 挂载
docker inspect nginx1 // 查看 monunts 下的 source, 就是把主机的 source 映射到了 nginx 的 /usr/share/nginx/html; 当修改 source 内容时 后者也会随之变动。
docker exec -it nginx1 /bin/bash // 以新终端形式进入容器
cd /usr/share/nginx/html
cat html // 若修改了 source 对应的文件则当前展示的内容也会随之改变
docker run -name nginx1 -v $PWD/html:/usr/share/nginx/html -p 80:80 -d nginx // 把当前路径下的 html 文件挂载到 /usr/share/nginx/html 文件
vi html // 写新的内容
curl http://localhost // 展示的就是刚刚新写的内容
docker create -v $PWD/data:/var/mydata --name rq ubuntu // 基于 ubuntu 镜像创建一个挂载指定卷的容器,该容器并没有启动 docker create 类似于 docker run -d
docker run --volumn-from rq ubuntu -it /bin/bash // 基于ubuntu 创建一个容器,该容器挂载容器 rq 的卷
mount //此时进入该容器了, 查看卷
cd /var/mydata
cat a.txt // ctrl + d 退出容器,此时就可以在当前路径的 data 中看到刚刚建立的 a.txt 了