docker容器的标准使用过程_Docker容器基础介绍

docker容器的标准使用过程_Docker容器基础介绍

2023年7月26日发(作者:)

docker容器的标准使⽤过程_Docker容器基础介绍Docker是PaaS 提供商 dotCloud 开源的⼀个基于 LXC 的⾼级容器引擎,源代码托管在 Github 上, 基于go语⾔并遵从Apache2.0协议开源。Docker是通过内核虚拟化技术(namespace以及cgroups等)来提供容器的资源隔离与安全保障。由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运⾏时,不需要类似虚拟机( VM)额外的操作系统开销,提⾼资源利⽤率。Docker是使⽤Go语⾔编写的⼀个程序运⾏、测试、交付的开放平台,Docker被设计为能够使你快速地交付应⽤。在Docker中,你可以将你的程序分为不同的基础部分,对于每⼀个基础部分都可以当做⼀个应⽤程序来管理。Docker能够帮助你快速地测试、快速地编码、快速地交付,并且缩短你从编码到运⾏应⽤的周期。Docker使⽤轻量级的容器虚拟化平台,并且结合⼯作流和⼯具,来帮助你管理、部署你的应⽤程序。Docker在其核⼼,Docker实现了让⼏乎任何程序都可以在⼀个安全、隔离的容器中运⾏。安全和隔离可以使你可以同时在机器上运⾏多个容器。Docker容器轻量级的特性,意味着可以得到更多的硬件性能。Docker原理:建⽴-->传送-->运⾏通过Docker Hub或者⾃⼰的Docker仓库分享Docker镜像, 从Docker镜像创建Docker容器, 在容器⾥运⾏应⽤程序。Docker镜像是如何⼯作的?Docker镜像是Docker容器运⾏时的只读模板,每⼀个镜像由⼀系列的层(layers)组成;Docker使⽤UnionFS(联合⽂件系统)来将这些层联合到⼀⼆镜像中,UnionFS⽂件系统允许独⽴⽂件系统中的⽂件和⽂件夹(称之为分⽀)被透明覆盖,形成⼀个单独连贯的⽂件系统。正因为有了这些层(layers)的存在,Docker才会如此的轻量。当你改变了⼀个Docker镜像,⽐如升级到某个程序到新的版本,⼀个新的层会被创建。因此,不⽤替换整个原先的镜像或者重新建⽴(在使⽤虚拟机的时候你可能会这么做),只是⼀个新的层被添加或升级了。所以你不⽤重新发布整个镜像,只需要升级。层使得分发Docker镜像变得简单和快速。每个镜像都是从⼀个基础的镜像开始的,⽐如ubuntu,⼀个基础的Ubuntu镜像,或者是Centos,⼀个基础的Centos镜像。你可以使⽤你⾃⼰的镜像作为新镜像的基础,例如你有⼀个基础的安装了Nginx的镜像,你可以使⽤该镜像来建⽴你的Web应⽤程序镜像。(Docker通常从Docker Hub获取基础镜像)Docker镜像从这些基础的镜像创建,通过⼀种简单、具有描述性的步骤,我们称之为 指令(instructions)。每⼀个指令会在镜像中创建⼀个新的层,指令可以包含这些动作:-> 运⾏⼀个命令。-> 增加⽂件或者⽂件夹。-> 创建⼀个环境变量。-> 当运⾏容器的时候哪些程序会运⾏。这些指令存储在Dockerfile⽂件中。当你需要建⽴镜像的时候,Docker可以从Dockerfile中读取这些指令并且运⾏,然后返回⼀个最终的镜像。Docker仓库的⽤处?Docker仓库是Docker镜像的存储仓库。可以推送镜像到Docker仓库中,然后在Docker客户端,可以从Docker仓库中搜索和拉取镜像。Docker容器是如何⼯作的?⼀个Docker容器包含了⼀个操作系统、⽤户添加的⽂件和元数据(meta-data)。每个容器都是从镜像建⽴的,镜像告诉Docker容器内包含了什么,当容器启动时运⾏什么程序,还有许多配置数据。Docker镜像是只读的,当Docker运⾏⼀个从镜像建⽴的容器,它会在镜像顶部添加⼀个可读写的层,应⽤程序可以在这⾥运⾏。Docker容器运⾏时会做哪些事情?使⽤docker命令时,Docker客户端都告诉Docker守护进程运⾏⼀个容器。# docker run -i -t ubuntu /bin/bash可以来分析这个命令,Docker客户端使⽤docker命令来运⾏,run参数表明客户端要运⾏⼀个新的容器。Docker客户端要运⾏⼀个容器需要告诉Docker守护进程的最⼩参数信息是:-> 这个容器从哪个镜像创建,这⾥是ubuntu,基础的Ubuntu镜像。-> 在容器中要运⾏的命令,这⾥是/bin/bash,在容器中运⾏Bash shell。那么运⾏这个命令之后在底层发⽣了什么呢?按照顺序,Docker做了这些事情:-> 拉取ubuntu镜像:Docker检查ubuntu镜像是否存在,如果在本地没有该镜像,Docker会从Docker Hub下载。如果镜像已经存在,Docker会使⽤它来创建新的容器。-> 创建新的容器:当Docker有了这个镜像之后,Docker会⽤它来创建⼀个新的容器。-> 分配⽂件系统并且挂载⼀个可读写的层:容器会在这个⽂件系统中创建,并且⼀个可读写的层被添加到镜像中。-> 分配⽹络/桥接接⼝:创建⼀个允许容器与本地主机通信的⽹络接⼝。-> 设置⼀个IP地址:从池中寻找⼀个可⽤的IP地址并且服加到容器上。-> 运⾏你指定的程序:运⾏指定的程序。-> 捕获并且提供应⽤输出:连接并且记录标准输出、输⼊和错误让你可以看到你的程序是如何运⾏的。由此就可以拥有⼀个运⾏着的Docker容器了!从这⾥开始你可以管理你的容器,与应⽤交互,应⽤完成之后,可以停⽌或者删除你的容器。Docker与VM的区别:docker与Openstack的对⽐Docker⽤途:简单配置、代码流⽔线管理、开发效率、应⽤隔离、服务器整合、调试能⼒、多租户、快速部署Docker可以快速交付应⽤程序Docker可以为你的开发过程提供完美的帮助。Docker允许开发者在本地包含了应⽤程序和服务的容器进⾏开发,之后可以集成到连续的⼀体化和部署⼯作流中。举个例⼦,开发者们在本地编写代码并且使⽤Docker和同事分享其开发栈。当开发者们准备好了之后,他们可以将代码和开发栈推送到测试环境中,在该环境进⾏⼀切所需要的测试。从测试环境中,你可以将Docker镜像推送到服务器上进⾏部署。Docker可以让开发和拓展更加简单Docker的以容器为基础的平台允许⾼度可移植的⼯作。Docker容器可以在开发者机器上运⾏,也可以在实体或者虚拟机上运⾏,也可以在云平台上运⾏。Docker的可移植、轻量特性同样让动态地管理负载更加简单。你可以⽤Docker快速地增加应⽤规模或者关闭应⽤程序和服务。Docker的快速意味着变动⼏乎是实时的。Docker可以达到⾼密度和更多负载Docker轻巧快速,它提供了⼀个可⾏的、符合成本效益的替代基于虚拟机管理程序的虚拟机。这在⾼密度的环境下尤其有⽤。例如,构建你⾃⼰的云平台或者PaaS,在中⼩的部署环境下同样可以获取到更多的资源性能。Docker改变了什么?-> ⾯向产品:产品交付-> ⾯向开发:简化环境配置-> ⾯向测试:多版本测试-> ⾯向运维:环境⼀致性-> ⾯向架构:⾃动化扩容Docker组件:镜像(Image)、容器(Container)、仓库(Repository)Docker 架构:C/S架构-> Docker使⽤客户端-服务器(client-server)架构模式。-> Docker 客户端会与Docker守护进程进⾏通信。Docker 守护进程会处理复杂繁重的任务,例如建⽴、运⾏、发布你的 Docker 容器。-> Docker 客户端和守护进程可以运⾏在同⼀个系统上,当然也可以使⽤Docker客户端去连接⼀个远程的 Docker 守护进程。-> Docker 客户端和守护进程之间通过socket或者RESTful API进⾏通信。Docker守护进程如上图所⽰,Docker守护进程运⾏在⼀台主机上。⽤户并不直接和守护进程进⾏交互,⽽是通过 Docker 客户端间接和其通信。Docker 客户端Docker 客户端,实际上是 docker 的⼆进制程序,是主要的⽤户与 Docker 交互⽅式。它接收⽤户指令并且与背后的 Docker 守护进程通信,如此来回往复。Docker 内部要理解Docker内部构建,需要理解以下三种部件:Docker 镜像 - Docker ImagesDocker 仓库 - Docker RegistryDocker 容器 - Docker ContainersDocker镜像是Docker容器运⾏时的只读模板,每⼀个镜像由⼀系列的层 (layers) 组成。Docker 使⽤ UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独⽴⽂件系统中的⽂件和⽂件夹(称之为分⽀)被透明覆盖,形成⼀个单独连贯的⽂件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了⼀个 Docker 镜像,⽐如升级到某个程序到新的版本,⼀个新的层会被创建。因此,不⽤替换整个原先的镜像或者重新建⽴(在使⽤虚拟机的时候你可能会这么做),只是⼀个新 的层被添加或升级了。现在你不⽤重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。Docker仓库⽤来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞⼤的镜像集合供使⽤。这些镜像可以是⾃⼰创建,或者在别⼈的镜像基础上创建。Docker 仓库是Docker 的分发部分。Docker容器和⽂件夹很类似,⼀个Docker容器包含了所有的某个应⽤运⾏所需要的环境。每⼀个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运⾏、开始、停⽌、移动和删除。每⼀个 Docker 容器都是独⽴和安全的应⽤平台,Docker 容器是 Docker 的运⾏部分。libcontainerDocker 从 0.9 版本开始使⽤ libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:下⾯说下Docker容器的底层技术:Namesapce(资源隔离)和Cgroup(资源限制)命名空间 [Namespaces]=> pid namespace:使⽤在进程隔离(Process ID)不同⽤户的进程就是通过pid namespace隔离开的,且不同 namespace 中可以有相同 PID。具有以下特征:-> 每个namespace中的pid是有⾃⼰的pid=1的进程(类似 /sbin/init 进程)-> 每个 namespace 中的进程只能影响⾃⼰的同⼀个 namespace 或⼦ namespace 中的进程-> 因为 /proc 包含正在运⾏的进程,因此在 container 中的 pseudo-filesystem 的 /proc ⽬录只能看到⾃⼰namespace 中的进程-> 因为 namespace 允许嵌套,⽗ namespace 可以影响⼦ namespace 的进程,所以⼦ namespace 的进程可以在⽗namespace中看到,但是具有不同的 pid=> mnt namespace:使⽤在管理挂载点(Mount)类似 chroot,将⼀个进程放到⼀个特定的⽬录执⾏。mnt namespace 允许不同namespace的进程看到的⽂件结构不同,这样每个namespace 中的进程所看到的⽂件⽬录就被隔离开了。同 chroot 不同,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在namespace的mount point。=> net namespace:使⽤在进程⽹络接⼝(Networking)⽹络隔离是通过 net namespace 实现的, 每个 net namespace 有独⽴的 network devices, IP addresses, IP routing tables,/proc/net ⽬录。这样每个 container 的⽹络就能隔离开来。 docker 默认采⽤ veth 的⽅式将 container 中的虚拟⽹卡同 host 上的⼀个docker bridge 连接在⼀起。=> uts namespace:使⽤在隔离内核和版本标识 (Unix Timesharing System)UTS ("UNIX Time-sharing System") namespace 允许每个 container 拥有独⽴的 hostname 和 domain name, 使其在⽹络上可以被视作⼀个独⽴的节点⽽⾮ Host 上的⼀个进程。=> ipc namespace:使⽤在管理进程间通信资源 (InterProcess Communication)container 中进程交互还是采⽤ Linux 常见的进程间交互⽅法 (interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然⽽同 VM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加⼊ namespace 信息 - 每个 IPC 资源有⼀个唯⼀的 32bit ID。=> user namespace:使⽤在管理空户空间每个 container 可以有不同的 user 和 group id, 也就是说可以以 container 内部的⽤户在 container 内部执⾏程序⽽⾮ Host 上的⽤户。有了以上6种namespace从进程、⽹络、IPC、⽂件系统、UTS 和⽤户⾓度的隔离,⼀个 container 就可以对外展现出⼀个独⽴计算机的能⼒,并且不同container从OS层⾯实现了隔离。然⽽不同 namespace 之间资源还是相互竞争的,仍然需要类似ulimit 来管理每个container所能使⽤的资源。资源配额 [cgroups]Docker还使⽤到了cgroups技术来管理群组。使应⽤隔离运⾏的关键是让它们只使⽤你想要的资源。这样可以确保在机器上运⾏的容器都是良民(good multi-tenant citizens)。群组控制允许Docker分享或者限制容器使⽤硬件资源。例如,限制指定的容器的内容使⽤。cgroups实现了对资源的配额和度量。 cgroups 的使⽤⾮常简单,提供类似⽂件的接⼝,在 /cgroup ⽬录下新建⼀个⽂件夹即可新建⼀个 group,在此⽂件夹中新建 task ⽂件,并将 pid 写⼊该⽂件,即可实现对该进程的资源控制。具体的资源配置选项可以在该⽂件夹中新建⼦ subsystem ,{⼦系统前缀}.{资源项} 是典型的配置⽅法, 如 nbytes 就定义了该 group 在 subsystem memory中的⼀个内存限制选项。另外,cgroups 中的 subsystem 可以随意组合,⼀个 subsystem 可以在不同的 group 中,也可以⼀个 group包含多个 subsystem - 也就是说⼀个 subsystem。=> memory内存相关的限制=> cpu在 cgroup 中,并不能像硬件虚拟化⽅案⼀样能够定义 CPU 能⼒,但是能够定义 CPU 轮转的优先级,因此具有较⾼ CPU 优先级的进程会更可能得到 CPU 运算。 通过将参数写⼊ ,即可定义改 cgroup 的 CPU 优先级 - 这⾥是⼀个相对权重,⽽⾮绝对值=> blkioblock IO 相关的统计和限制,byte/operation 统计和限制 (IOPS 等),读写速度限制等,但是这⾥主要统计的都是同步 IO=> devices设备权限限制Docker 联合⽂件系统联合⽂件系统(UnionFS)是⽤来操作创建层的,使它们轻巧快速。Docker使⽤UnionFS提供容器的构造块。Docker可以使⽤很多种类的UnionFS包括AUFS, btrfs, vfs, and DeviceMapper。Docker 容器格式Docker连接这些组建到⼀个包装中,称为⼀个 container format(容器格式)。默认的容器格式是libcontainer。Docker同样⽀持传统的Linux容器使⽤LXC。在未来,Docker也许会⽀持其它的容器格式,例如与BSD Jails 或 Solaris Zone集成。======================== Docker环境的安装部署==========================环境准备(centos7)# yum install -y docker# systemctl start docker# systemctl enable docker镜像的查看(docker images信息结果包括:镜像仓库、标签、镜像ID、创建时间、镜像⼤⼩ )[root@linux-node2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL /centos latest 60e65a8e4030 36 hours ago 196.6 /nginx latest 813e3731b203 9 days ago 133.8 /registry latest a8706c2bfd21 2 weeks ago 422.8 MB镜像的导出、导⼊和下载(可以将本机下载的镜像导出,然后将导出⽂件上传到别的机器上,在别的机器上进⾏镜像导⼊)[root@linux-node2 ~]# docker pull centos[root@linux-node2 ~]# docker save centos > /opt/将linux-node2的镜像导出⽂件上传到linux-node1机器上,然后在linux-node1机器上导⼊[root@linux-node1 ~]# docker load < /opt/镜像的删除(rmi后⾯可以跟多个id,⽤空格隔开)docker rmi container_id[root@linux-node2 ~]# docker rmi 813e3731b203Docker重命名镜像名称和TAG# docker tag IMAGEID(镜像id) REPOSITORY:TAG(仓库:标签)[root@docker-test2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE93ec41b5ed04 About an hour ago 435.9 MB[root@docker-test2 ~]# docker tag 93ec41b5ed04 kevin/nginx:v1[root@docker-test2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEkevin/nginx v1 93ec41b5ed04 About an hour ago 435.9 MB⾸次创建⼀个简单的容器[root@linux-node2 ~]# docker run centos /bin/echo "hehe"hehe查看容器状态可以使⽤docker ps只能看见存活的容器,docker ps -a 查看全部的容器,结果信息表⽰:容器ID、使⽤的镜像、执⾏的命令、创建的时间、状态、端⼝、名称(如果不指定,⾃动⽣成)[root@linux-node2 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESdaeb4d7f7aab centos "/bin/echo hehe" About a minute ago Exited (0) About a minute ago insane_einstein创建容器--name:指定容器名称-t :分配⼀个tty终端-i :容器的标准输保持打开的状态[root@linux-node2 ~]# docker run --name mydocker -t -i centos /bin/bash[root@94ab7a046f7c /]# ps auxUSER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.1 11772 1872 ? Ss 03:42 0:00 /bin/bashroot 14 0.0 0.0 35888 1472 ? R+ 03:43 0:00 ps aux这种⽅式创建⾃动进⼊容器,开启的容器只执⾏/bin/bash;在容器中查看主机名[root@94ab7a046f7c /]# hostname94ab7a046f7c[root@94ab7a046f7c /]# exit启动、停⽌容器# docker stop ID# docker start ID进⼊容器[root@linux-node2 ~]# docker attach 94ab7a046f7c[root@94ab7a046f7c /]#删除容器[root@linux-node2 ~]# docker rm ID/名称加-f 强制删除,包括正在运⾏中的容器映射随机映射 (端⼝的映射是系统⾃动分配的)[root@linux-node2 ~]# docker run -d -P nginx90316d97ee975b4e62e1927a9fb31f20703556b1a3ea07880d0c68dcb5bbd3bb[root@linux-node2 ~]# docker ps -lCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES90316d97ee97 nginx "nginx -g 'daemon off" 25 seconds ago Up 23 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp ecstatic_almeida指定映射 (如下,指定容器的80端⼝映射到主机的81端⼝上)[root@linux-node2 ~]# docker run -d -p 81:80 nginx0294a8f5b4fc81ba31383a8eb98ec62b136826eba92360c84afd87bf1bf819fc[root@linux-node2 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES0294a8f5b4fc nginx "nginx -g 'daemon off" 11 seconds ago Up 10 seconds 443/tcp, 0.0.0.0:81->80/tcpadmiring_ramanujan查看⽇志命令为"docker logs +ID"数据管理数据卷默认挂载⽬录创建⼀个数据卷,名称是volume-test1,挂载到data下默认挂载⽬录[root@linux-node2 ~]# docker run -it --name volume-test1 -v /data centos[root@1768d6414cfc /]# ls -l /data/total 0列出容器的所有信息,查看mounts模块[root@linux-node2 ~]# docker inspect 1768d6414cfc"Mounts": [{"Name": "55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167","Source":"/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data","Destination": "/data","Driver": "local","Mode": "","RW": true}],查找挂载点并进⼊[root@linux-node2 ~]# ll/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data总⽤量 0[root@linux-node2 ~]# cd/var/lib/docker/volumes/55c97df0276bb8879398b4e7286fc41f9872e9203267da7e23060e24ba06d167/_data创建⼀个cgt测试,并重新回到容器中查看[root@linux-node2 _data]# mkdir cgt去容器中查看[root@1768d6414cfc /]# ls -l /data/total 4drwxr-xr-x 2 root root 4096 Jan 4 14:04 cgt指定挂载⽬录。将容器的/opt映射到主机的/opt⽬录下(下⾯命令中前⼀个是主机路径,后⼀个是容器路径)[root@linux-node2 ~]# docker run -it --name volume-test1 -v /opt:/opt centos指定权限只需要在挂载后⾯加上权限即可。rw为读写,ro为只读[root@linux-node2 ~]# docker run -it --name volume-test1 -v /opt:/opt:rw centos挂载单个⽂件记录历史记录[root@linux-node2 ~]# docker run -it -v ~/.bash_history:/.bash_history centos数据卷容器让⼀个容器可以访问另⼀个容器的数据卷。启动两个容器启动nfs容器,挂在⼀个卷,使⽤-d直接在后台执⾏[root@linux-node2 ~]# docker run -d --name nfs -v /data centos209bc89b365ad6bc1eeae693ada01c04c2d08e9ee2b8816e624882944c116126启动test1容器,挂载到nfs的数据卷容器上,[root@linux-node2 ~]# docker run -it --name test1 --volumes-from nfs centos[root@5e399198d6a8 /]# ls /data/查看没内容找到nfs容器的挂载点(可以使⽤名称,不仅仅是ID)找到nfs容器的ID[root@linux-node2 opt]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES209bc89b365a centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago nfs找到nfs容器的挂载点[root@linux-node2 _data]# docker inspect nfs[root@linux-node2 opt]# cd/var/lib/docker/volumes/3938c9b1143d41340e148a4c7bc12d13b53966b15380c5b958a9e035897450d5/_data[root@linux-node2 _data]# touch cgt在test1上查看[root@5e399198d6a8 /]# ls /data/cgt注意:数据卷容器不论停⽌还是开启,不影响其他容器挂载使⽤如何制作镜像⽅式⼀:⼿动构建容器1)创建⼀个容器mynginx,使⽤centos镜像[root@linux-node2 ~]# docker run --name mynginx -it centos[root@f9c7dfb6f552 /]# yum -y install nginx[root@f9c7dfb6f552 /]# exitexit2)基于mynginx容器做⼀个镜像mynginx:v1[root@linux-node2 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf9c7dfb6f552 centos "/bin/bash" 3 minutes ago Exited (0) 15 seconds ago mynginx基于mynginx这个容器做⼀个镜像[root@linux-node2 ~]# docker commit -m "my nginx" f9c7dfb6f552 cgt/mynginx:v13f3adc859b77b2b47c3631229761bee6c7066f1c708bc01c5173c2ef5c0adce8提交镜像,同时打⼀个标签叫mynginx:v1,cgt相当于你向github上提交的⽤户名查看镜像[root@linux-node2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEcgt/mynginx v1 3f3adc859b77 About a minute ago 326.4 MB3)基于mynginx:v1创建⼀个容器mynginxv1,⽬的是修改nginx不让其在后台运⾏[root@linux-node2 ~]# docker run -it --name nginxv1 cgt/mynginx:v1[root@ea64c5855006 /]# vi /etc/nginx/emon off; # 不再后台运⾏[root@ea64c5855006 /]# exitexit[root@linux-node2 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESea64c5855006 cgt/mynginx:v1 "/bin/bash" 2 minutes ago Exited (0) 42 seconds ago nginxv14)基于mynginxv1提交mynginxv2版本重新提交V2版本[root@linux-node2 ~]# docker commit -m "my nginx" ea64c5855006 cgt/mynginx:v2a480cdf9055ec4e640c65df6404c6ba42903ea77198a26cec75eef0e4965fe67查看V2镜像[root@linux-node2 ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEcgt/mynginx v2 a480cdf9055e 25 seconds ago5)基于mynginxv2镜像,创建mynginxv2容器启动容器,-d后台运⾏,-p指定端⼝ 在后⾯是镜像,最后是命令(因为是yum安装的,可以直接写nginx,如果不是yum,那要写绝对路径)[root@linux-node2 ~]# docker run -d -p 82:80 cgt/mynginx:v2 nginx4eaf8a19034a673100f9355504628fad45e6ecbab91615afd6cb4e7a18b82171[root@linux-node2 ~]# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES4eaf8a19034a cgt/mynginx:v2 "nginx" 15 seconds ago Up 14 seconds 0.0.0.0:82->80/tcp elegant_leakey可以在浏览器访问82端⼝⽅式⼆:Dockerfile1)Dockerfile包含的信息- 基础镜像信息- 维护者信息- 镜像操作指令- 容器启动时执⾏指令2)⽂件的编写[root@linux-node2 ~]# mkdir /opt/dockerfile/nginx/ -p[root@linux-node2 ~]# cd /opt/dockerfile/nginx/将上传到此处[root@linux-node2 nginx]# vim Dockerfile# This is docker file# version v1# Author wangshibo# Base image(基础镜像)FROM centos# Maintainer(维护者信息)MAINTAINER wangshibo 2134728394@# Commands(执⾏命令)RUN yum -y install nginx# Add(添加⽂件)ADD /usr/share/nginx/html/ # 是⾃⼰编写的⽂件,放在后⾯的⽬录中,因为yum安装后Documentroot是在这⾥RUN echo "daemon off;" >>/etc/nginx/POSE 80 # 对外的端⼝CMD ['nginx'] # 执⾏的命令3)构建容器,并运⾏。 建⽴newnginx容器,-t:标签,执⾏/opt/dockerfile/nginx/下⾯的默认的Dockerfile⽂件[root@linux-node2 nginx]# docker build -t cgt/mynginx:v3 /opt/dockerfile/nginx/[root@linux-node2 nginx]# docker run -d -p 83:80 cgt/mynginx:v3Docker是⼀个开源的应⽤容器引擎,让开发者可以打包他们的应⽤以及依赖包到⼀个可移植的容器中,然后发布到任何流⾏的Linux机器上,也可以实现虚拟化。当你真正投⼊容器Docker的怀抱,不但可以发现它能解决很多问题,⽽且还具有众多的优点:->它是不可变的-操作系统,库版本,配置,⽂件夹和应⽤都是⼀样的。您可以使⽤通过相同QA测试的镜像,使产品具有相同的表现。->它是轻量级的-容器的内存占⽤⾮常⼩。不需要⼏百⼏千MB,它只要对主进程分配内存再加上⼏⼗MB。-> 它很快速-启动⼀个容器与启动⼀个单进程⼀样快。不需要⼏分钟,您可以在⼏秒钟内启动⼀个全新的容器。许多⽤户依然像对待典型的虚拟机那样对待容器,似乎都忘记了除了与虚拟机相似的部分,容器还有⼀个很⼤的优点:它是⼀次性的。这个"特性"本⾝促使⽤户改变他们关于使⽤和管理容器的习惯;下⾯将会说明下在容器中不应该做这些事,以确保最⼤地发挥容器的作⽤。->不要在容器中存储数据 – 容器可能被停⽌,销毁,或替换。⼀个运⾏在容器中的程序版本1.0,应该很容易被1.1的版本替换且不影响或损失数据。有鉴于此,如果你需要存储数据,请存在卷中,并且注意如果两个容器在同⼀个卷上写数据会导致崩溃。确保你的应⽤被设计成在共享数据存储上写⼊。->不要将你的应⽤发布两份 – ⼀些⼈将容器视为虚拟机。他们中的⼤多数倾向于认为他们应该在现有的运⾏容器⾥发布⾃⼰的应⽤。在开发阶段这样是对的,此时你需要不断地部署与调试;但对于质量保证与⽣产中的⼀个连续部署的管道,你的应⽤本该成为镜像的⼀部分。记住:容器应该保持不变。->不要创建超⼤镜像 – ⼀个超⼤镜像只会难以分发。确保你仅有运⾏你应⽤/进程的必需的⽂件和库。不要安装不必要的包或在创建中运⾏更新(yum更新)。->不要使⽤单层镜像 – 要对分层⽂件系统有更合理的使⽤,始终为你的操作系统创建你⾃⼰的基础镜像层,另外⼀层为安全和⽤户定义,⼀层为库的安装,⼀层为配置,最后⼀层为应⽤。这将易于重建和管理⼀个镜像,也易于分发。->不要为运⾏中的容器创建镜像 – 换⾔之,不要使⽤"docker commit"命令来创建镜像。这种创建镜像的⽅法是不可重现的也不能版本化,应该彻底避免。始终使⽤Dockerfile或任何其他的可完全重现的S2I(源⾄镜像)⽅法。->不要只使⽤"最新"标签 – 最新标签就像Maven⽤户的"快照"。标签是被⿎励使⽤的,尤其是当你有⼀个分层的⽂件系统。你总不希望当你2个⽉之后创建镜像时,惊讶地发现你的应⽤⽆法运⾏,因为最顶的分层被⾮向后兼容的新版本替换,或者创建缓存中有⼀个错误的"最新"版本。在⽣产中部署容器时应避免使⽤最新。->不要在单⼀容器中运⾏超过⼀个进程-容器能完美地运⾏单个进程(http守护进程,应⽤服务器,数据库),但如果运⾏多个进程,管理、获取⽇志、独⽴更新都会遇到⿇烦。->不要在镜像中存储凭据。使⽤环境变量 –不要将镜像中的任何⽤户名/密码写死。使⽤环境变量来从容器外部获取此信息。->使⽤⾮root⽤户运⾏进程 – "docker容器默认以root运⾏。(…)随着docker的成熟,更多的安全默认选项变得可⽤。现如今,请求root对于其他⼈是危险的,可能⽆法在所有环境中可⽤。你的镜像应该使⽤USER指令来指令容器的⼀个⾮root⽤户来运⾏。"->不要依赖IP地址 – 每个容器都有⾃⼰的内部IP地址,如果你启动并停⽌它地址可能会变化。如果你的应⽤或微服务需要与其他容器通讯,使⽤任何命名与(或者)环境变量来从⼀个容器传递合适信息到另⼀个。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690379588a340699.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信