docker的构成

(1)Build - 构建镜像 - [镜像 类比 集装箱] :
docker镜像就是image。从本质上来说镜像就是一系列的文件(包括应用程序的文件,也包括应用环境的文件),以联合文件系统分层的形式保存到本地;docker中的文件系统都是只读的
(2)Ship - 运输镜像(从仓库和我们的主机上运输)- [仓库 类比 超级码头] :
构建镜像的目的:是为了在其他的服务器,其他的环境运行我们的程序。(为了在其他地方运行,我们就需要将构建的镜像传递到目的地才可以,仓库可以起到传输传递作用。)传输过程:先将构建的镜像传到docker仓库中,再由目的地去docker仓库将我们的镜像拉过去,这样就完成了传输过程。docker仓库的提供者:中央服务器 中央服务器地址:hub.docker.com(国际)、c.163.com(国内)
(3)Run - 运行镜像(运行的镜像就是一个容器)- [容器 就是 运行程序的地方] :
Docker容器的本质是一个进程。Docker镜像的每一层都是只读的,而容器作为最上层,是可读可写的。如果程序需要对镜像进行修改,那么Docker会把要修改的镜像文件拷贝到最上层的容器中,然后再进行修改。往后对该文件的访问会优先从容器中读取,寻找文件的顺序是从下往下。
Docker 运行过程: 去仓库把镜像拉倒本地,然后用一条命令把镜像运行起来变成容器!
docker执行流程:
(1)docker pull:首先客户端client向Docker daemon发送命令docker pull,告诉Docker daemon要拉取哪个镜像,Docker daemon会先在本机检查这个镜像是否存在,如果存在并且版本一致,它不会做任何操作;如果不存在,它会到Docker的镜像仓库中寻找,如果找到了,就会把仓库中的镜像拉取到本地。
(2)docker run:客户端将docker run命令发送到Docker deamon中,Docker deamon会先检查这个镜像是否在本地已经存在,如果不存在,它会到仓库中寻找,把镜像下载到本地,下载之后它会通过一定的方式把镜像运行起来,变成docker容器
docker解决的问题
(1)docker解决了运行环境不一致带来的问题
(2)docker隔离性,每台服务器相互隔离,互不影响,可以保证自己运行的程序不受其他程序的影响。
(3)一键化部署服务器(例如双11,服务器数量。。。),docker的标准化让快速扩展,弹性伸缩变得简单。
备注:不建议把数据库部署在docker容器内 https://www.docker.org.cn/docker/185.html
环境准备
安装:
提示:如果存在问题可以执行下面官网安装推荐:官方安装教程地址
1.安装docker的依赖库➜ sudo yum install -y yum-utils2.添加docker-ce的软件源信息➜ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo#sudo yum install -y containerd.io3.安装docker-ce和containerd➜ sudo yum install -y docker-ce docker-ce-cli containerd.io4. 启动Docker服务,并加入开机自启➜ sudo systemctl enable --now docker等价于下面两行➜ #systemctl start docker➜ #systemctl enable docker5.测试安装是否成功➜ docker ps
镜像加速
Docker的默认官方远程仓库是hub.docker.com,由于网络原因,下载一个Docker官方镜像可能会需要很长的时间,甚至下载失败。为此,阿里云容器镜像服务ACR提供了官方的镜像站点,从而加速官方镜像的下载。下面介绍如何使用阿里云镜像仓库 加速器地址:https://k4obhtjz.mirror.aliyuncs.com (这个是我私人使用的)
针对Docker客户端版本大于 1.10.0 的用户,创建daemon.json在/etc/docker
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,
sudo mkdir -p /etc/dockervi insert下面{"registry-mirrors": ["https://k4obhtjz.mirror.aliyuncs.com"]}或者是使用163的加速器{"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn"]}sudo systemctl daemon-reloadsudo systemctl restart docker
使用docker info 来查看镜像是否生效
docker常用命令
- docker pull [OPTIONS] NAME [:TAG] :此命令的作用是从docker远程的仓库拉取镜像到本地 (命令中的NAME项是必填的代表我们需要拉取的镜像名称; [:TAG]是可选的,是代表镜像的版本; [OPTIONS]是代表拉取的镜像参数)例如:拉取hello-world镜像命令:docker pull hello-world
- docker images [OPTIONS] [REPOSITORY[:TAG]] :此命令是来查看我们本机都有哪些镜像,也可以验证我们的pull是否执行成功(命令中[OPTIONS]是镜像的参数; [REPOSITORY[:TAG]]是镜像的名称和版本)
docker images命令的参数含义:
REPOSTTORY : 镜像名字
TAG : 版本(lastest 最新版)
IMAGE ID : 64 位的字符串,可以唯一标识镜像,这里只显示16位,后面的被截掉了。
CREATED : 创建时间 (最后修改时间)
SIZE : 大小
- docker run [OPTIONS] IMAGE [:TAG] [COMMAND] [ARG…] :运行镜像,命令中IMAGE镜像名字项为必填项
- docker run -d 镜像名: 后台运行容器
- docker ps: 查看正在运行的容器
- docker exec -it :在运行的容器中运行命令
- docker run —help: 可以查看docker run 都有哪些参数;
docker pull hub.c.163.com/library/nginx:latest 拉取nginx镜像
docker run hub.c.163.com/library/nginx 在前台运行Nginx;
docker run -d hub.c.163.com/library/nginx 在后台运行Nginx并打印相应运行Id;docker run -d -p 主机端口:容器端口 容器的名称:启动镜像,并执行映射端口
比如:docker run -d -p 8080:80 hub.c.163.com/library/nginx
docker run -d -P —name 容器名称docker stop 容器名称:停止docker 删除的话 后面追加 docker rm -rf 容器名称
docker build -t 容器名称:版本 Dockerfile文件目录: 构建镜像 如:docker build -t demo:latest .
docker拉取镜像
查看Docker镜像仓库中Nginx的可用版本。
docker search nginx
- 拉取最新版的Nginx镜像。
docker pull nginx:latest
- 使用docker images 前后两次查看本地的镜像文件

- 运行nginx (有三种方式运行)
上面我们只运行了nginx,并没有用浏览器进行访问,这里我们尝试用浏览器访问,但是之前我们要了解一下docker网络.第一种:docker run nginx(在前台运行容器命令如下,输入后容器就会运行,按ctrl+c可以终止容器的运行)第二种:docker run -d nginx(后台运行)
我们了解docker的隔离性,网络也是个隔离性的一部分,linux使用了命名空间来进行资源的隔离,比如pid namespace就是用来隔离进程的,mount namespace是用来隔离文件系统的,network namespace 是用来隔离网络的.每一个network namespace都提供了一个独立的网络环境,包括网卡路由iptable规则等等,都是与以其它的network space隔离的.
1. docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式.
在使用Bridge时就涉及到了一个问题,既然它有独立的namesapce,这就需要一种技术使容器内的端口可以在主机上访问到,这种技术就是端口映射,docker可以指定你想把容器内的某一个端口可以在容器所在主机上的某一个端口它俩之间做一个映射,当你在访问主机上的端口时,其实就是访问容器里面的端口.
2. 还有一种类型是Host模式,如果在启动容器的时候指定使用Host模式,那么这个容器将不会获得一个独立的network namespace,而是和主机共同使用一个,这个时候容器将不会虚拟出自己的网卡,配置出自己的ip.而是使用宿主机上的ip和端口.也就是说在docker上使用网络和在主机上使用网络是一样的.
3. 还有一种网络类型是None.也就是没有网络,这种情况docker将不会和外界的任何东西进行通讯.
刚才我们在运行nginx镜像的时候并没有指定端口映射,所以我们这里停掉nginx容器.
查看运行的容器 docker ps
docker stop clever_vanguhan(容器的名字)
查看主机8080端口是否开启(有数据说明此端口处于开放)第三种:docker run -p 8080:80 -d nginx命令参数说明:--nginx:容器名称--d nginx: 设置容器在后台一直运行。-p 8080:80: 端口进行映射,将本地8080端口映射到容器内部的80端口。

我用的是阿里云服务器,因为开始用的时候只对几个端口进行了开放,记得去开启您要的端口,对应的位置在:找到对应的实例,点击管理—>本实例安全组—>配置规则
修改容器内部配置文件?
但这样明显修改起来就很费劲,所以nginx给我们提供了进入容器内部的命令:docker exec –it 容器ID /bin/bash 在通过找到nginx的安装目录,ng一般是安装在/usr/share/nginx,如果你想对当前文件夹中的index.html进行修改的话,一般我们是通过vi命令,但是其中很多命令是没法用的,也不允许你安装。这时候怎么办呢?
可以使用cp命令将本地的文件拷到容器内部来进行一个替换,也可以内部文件拷贝出去。
第一种方式:
#首先第一步先创建一个htmltouch index.html就随便打几个<html><h1>aaaaaaa</h1></html>#将准备好的文件进行替换(angry_johnson 容器名称)docker cp index.html angry_johnson:/usr/share/nginx/html/index.html可以进入到容器内部进行查看root@c60d6ca6da24:/usr/share/nginx/html# cat index.html 发现与之一致
第二种方式:
#直接在服务器界面输入命令cp angry_johnson:/usr/share/nginx/html/index.html /root#然后到本地root目录下查看文件是否生成,然后在重复上述步骤
参考文章:
https://blog.csdn.net/q610376681/article/details/90483576?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.edu_weight
https://www.imooc.com/article/details/id/282731
