初始概念:一个服务器的三种进程想放入不同的容器中
早期的虚拟化技术:宿主机上安装虚拟机,实现不同的操作系统,不同的程序运行
发展到现在的容器技术,通过docker引擎(或者其他容器)把不同的进程连接到宿主机操作系统上
selink设置
docker部署1
docker部署2
Error response from daemon: Get “https://registry-1.docker.io/v2/”: unauthorized: incorrect username or password
镜像的结构:
${registory_name} / ${repository_name} / ${image_name}:
${tag_name}
- registory:远端仓库的地址url
- repository_name:分类仓库的名称
- image_name:镜像名称
- tag_name:标签名称
例子:docker.io/library/alpine:3.10.1
1、Linux命令行
<-----镜像搜索----->
docker search alpine
<-----镜像下载----->
docker pull alpine
docker pull alpine:3.10.1 下载指定版本
<-----查看本地镜像----->
docker images/docker image ls
docker images|grep alpine ==>查看带有alpine的镜像
<-----给镜像打标签,不同的标签可以指向同一个镜像----->
docker tag $image_id docker.io/library/alpine:v3.10.3(路径)
<-----推送镜像,也就是把镜像推送到docker hub上----->
docker push docker.io/library/alpine:v3.10.3(路径)
<-----删除镜像,rmi===remove images ----->
docker rmi docker.io/library/alpine:vv3.10.3 ===>只删除了标签
docker rmi -f $image_id ====> 彻底删除镜像
<------登录镜像------->
docker login docker.io
- 典型的Linux文件系统由bootfs和rootfs两部分组成-
- bootfs (boot file system)主要包含bootloader和kernel,
bootloader主要是引导加载kernel,当kernel被加载到内存中后bootfs就被umount了。- rootfs (root file system) 包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。
- Docker容器是建立在Aufs基础上的,(Advanced Union FS)是一种Union FS, 简单来说就是支持将不同的目录挂载到同一个虚拟文件系统下,并实现一种layer的概念。
- Aufs将挂载到同一虚拟文件系统下的多个目录分别设置成read-only,read-write以及whiteout-able权限,对read-only目录只能读,而写操作只能实施在read-write目录中。
- 重点在于,写操作是在read-only上的一种增量操作,不影响read-only目录。当挂载目录的时候要严格按照各目录之间的这种增量关系,将被增量操作的目录优先于在它基础上增量操作的目录挂载,待所有目录挂载结束了,继续挂载一个read-write目录,如此便形成了一种层次结构。
原因分析:在build自己的镜像的时候添加tag时必须在前面加上自己的dockerhub的username,如下图红圈所示,然后再push就可以了
1、linux命令行
<----列出本地容器的进程----->
docker ps -a ===>无论存活或者删除的容器都列出来
docker ps ===>只列出还存在的容器
<----启动容器(运行镜像)----->
docker run [OPTIONS] image [COMMAND][ARG...]
OPTIONS:
-i:表示启动一个可交互的容器,并且持续打开输入标准
-t:表示使用终端关联到容器的标准输入输出
-d:表示将容器放置到后台运行
-rm:表示退出后即删除容器
-name:表示定义容器唯一的名称
image:表示镜像
[COMMAND]:表示启动容器时要运行的命令
<----查看宿主机进程----->
ps aux|grep sleep|grep -v grep
<----进入容器----->
docker exec -ti 容器id /bin/sh
<----停止容器进程----->
docker stop 容器id
<----重启容器进程----->
docker start/stop/restart 容器id/容器名称
<----删除容器----->
docker rm [-f] 容器名称
docker rmi [-f] 容器名称 # 删除本地一个或多个镜像,-f强制删除
for i in `docker ps -a|grep -i exit|awk '{print $1}'`;do docker rm -f $i;done
<----从容器创建一个新的镜像----->
docker commit -p (容器名)myalpine (新的镜像名)oldboy1103/alpine:v3.10.3_with_1.txt
<----导入/导出镜像----->
<----导出----->
docker images
docker save $image_id > alpine:v3.10.3_with_1.txt.tar
<----导入----->
docker load <alpine:3.10.3_with_1.txt.tar
<----查看日志----->
docker logs $image_id
持续输入输出的容器
非交互式的容器
后台运行,加一个sleep 300==>后台运行时间可以持续5分钟
导出镜像
导入镜像
查看日志
<------映射端口------->
docker run -p 容器外端口:容器内端口
docker run --rm(用完就删) --name(起名) mynginx -d -p81:80 oldboy1103/nginx:v1.12.2
<-------挂载数据卷--------->
mkdir html
wget www.baidu.com -O index.html
docker run -v 容器外目录:容器内目录
![请添加图片描述](https://img-blog.csdnimg.cn/df72b4bc935945e4949f103b62b21c87.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVG9uQ0M=,size_20,color_FFFFFF,t_70,g_se,x_16)
docker run -e 环境变量key=环境变量value
yum/apt-get/apt
yum源一般是在etc/yum/repos.d
debian系发行版使用的更多 etc/apt/sources.list
Rehat系发行版使用的更少
1、容器的生命周期
- 检查本地是否存在镜像,如果不存在就从远端仓库检索
- 利用镜像启动容器
- 分配一个文件系统,并在只读的镜像层外挂载移断层可读写层
- 从宿主机配置的网络接口中桥接一个虚拟机接口到容器
- 从地址池配置一个ip地址给容器
- 执行用户指定的指令
- 执行完毕后容器终止
3.1 基本规则
3.2 四组核心的Dockerfile指令
1、进入编辑模式
2、创建
USER/WORKDIR指令
ADD/EXPOSE指令
RUN/ENV指令
docker CMD/ENTRYPOINT指令
1、NAT模式(默认)
2、None ------ Docker中不需要由网络设备或者网卡,不对外i提供http服务,tcp服务等等