前端到docker入门
Posted chenby
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前端到docker入门相关的知识,希望对你有一定的参考价值。
Docker的诞生
我们总是会遇到测试对开发说项目又不work了,开发总说:在我电脑上是ok的阿。
项目组加了新人,我们就需要教新人配置各种开发环境,每换一台机器就要配置一次,每来一个新人就要配置一次。
于是我们想,有什么办法可以在安装软件的时候把环境也安装过来?一摸一样复制过来就没这么多问题了。
于是,我们开始用虚拟机,它自己一套系统,然后你在里面配置好环境,复制给队友就好了。根本上虚拟机也是一个文件。
但是有个缺点就是太大了!启动太慢!一些系统的操作完全是多余的。
于是就开始用linux容器。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。容器里面的应用,直接就是底层系统的一个进程,操作系统使用宿主的操作系统。
Docker 就是 Linux 容器的一种封装。
Docker 做什么
- web应用的自动化打包测试
- 微服务
- 提供开发环境
安装docker应用
mac 安装地址https://store.docker.com/editions/community/docker-ce-desktop-mac
通过dmg安装,打开这个应用就可以了。
通过docker -v
来测试有没有安装成功。
第一个docker应用
docker的强大之处,一句开启一个nginx服务。
docker run -d -p 80:80 --name webserver nginx
然后打开 http://localhost 看一下,如果没有问题应该就可以看到nginx的欢迎页了。
docker image
docker的核心概念之一,image,image其实就是镜像。一个容器是由1个或多个image组成的,比如我们nginx的应用,就是下载了docker提供的nginx镜像。
一个web应用可以有多个image,比如nginx,python,db等等,我们可以自由组合image从而生成我们自己的iamge!发布我们自己的image,大家就可以直接下载我们的镜像,从而直接在同一个环境下开发和获取服务啦。
我们可以看一下我们当地的镜像。
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest b175e7467d66 3 weeks ago 109MB
可以看到每个镜像的一些信息,也可以通过docker image rm nginx
来删除这个镜像。
docker container
docker的核心概念之二,container,container是docker的容器,我们所有运行的程序都需要container来承载。
运行一个程序需要做什么?首先需要从docker hub上面找到我们需要的image文件(也可以根据自己的需求自己构造image文件),然后通过docker run命令生成一个容器来供程序运行,然后我们的程序就可以运行在docker上了。
我们第一个应用的docker container run
命令会从 image 文件,生成一个正在运行的容器实例,我们就可以通过ip来访问这个服务。
我们第一个命令的各个参数含义如下:
-d container做为守护进程在后台运行
-p 本机80端口映射container80短裤
--name 容器的名字叫做webserver。
为什么我们只有run命令而没有拉取nginx的image文件呢?
docker会首先找本地nginx image,如果没有就自动从docker hub上面下载。
当然也可以自己首先下载到本地:docker image pull library/nginx
其中library是 image 文件所在的组,由于 Docker 官方提供的 image 文件,都放在library组里面,所以它的是默认组,可以省略。
image 文件生成的容器实例,本身也是一个文件,称为容器文件。
也就是说,一旦容器生成,就会同时存在两个文件: image 文件和容器文件。
而且关闭容器并不会删除容器文件,只是容器停止运行而已。
# 列出本机正在运行的容器
$ docker container ls
# 列出本机所有容器,包括终止运行的容器
$ docker container ls -a
我们可以看到我们正在运行的nginx服务。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b559b5addf8 nginx "nginx -g ‘daemon of…" 13 days ago Up 2 seconds 0.0.0.0:80->80/tcp webserver
当然我们也可以通过start,stop,restart来控制服务的情况。
比如
docker container stop webserver
我们通过ps命令来看一下现在的容器情况:
docker ps -a
会看到,我们的webserver的status:Exited (0) About a minute ago。我们再运行docker container start webserver
就可以重启服务。
可以简写为
docker start webserver
和docker stop webserver
,docker rm webserver
。rm命令顾名思义就是删除这个container了。
容器通信
关于容器和image的基础操作其实就几个命令。还有容器的通信也是很重要的,因为我们需要知道容器的情况,debug什么的,就需要对容器进行操作。
这只讲一个命令就是docker exec
。这个命令就允许你进入容器。
比如docker exec -it webserver bash
。
-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。
bash:容器启动以后,内部第一个执行的命令。这里是启动 Bash,保证用户可以使用 Shell。
这样我们就进入到了webserver的容器内部,我们可以通过修改nginx.conf来操作nginx服务,或者查看nginx的log。
docker log
docker的log有个命令docker logs webserver
,我们可以看到docker的这个服务的访问情况。
有时候会遇到
docker start xxx
然后看一下docker ps -a
,这个xxx还是没有启动。这时候可以看一下docker logs xxx
,他很可能报错了。然后你的容器就启动不了了。
生成自己的image文件
之前提到,你进行了一些操作,容器启动不了,然后你进入这个bash,他会告诉你需要先启动容器才能进入bash。那怎么办呢,此时就需要一些比较麻烦的办法了,比如接下来要说的生成自己的image文件。
docker run -d -p 80:80 --name webserver nginx
,后面指定了nginx做为image,它启动就会首先执行nginx xxx来开启这个nginx服务。但是因为一些原因开启不了。那我们只能以bash的方式‘开启’这个容器。然后修改这个container的内容。再以nginx的方式重启。
我们怎么以bash的方式启动我们这个nginx container呢?我们需要把当前的container生成为一个我们自己的image文件。
我们通过run命令把image文件生成一个container文件,我们也可以通过docker commit
来生成我们的image文件:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
docker commit -a 0b559b5addf8 temp
,我们生成一个临时的temp image。可以通过docker image ls
查看我们生成的image。
docker rm webserver
我们删掉没用的container。
docker run -it --name webserver -p 80:80 -d temp
。我们根据我们生成的temp来生成一个container容器。
ok,现在我们可以docker exec -it webserver bash
来修改我们的配置了。
修改完之后还需要再次生成一个iamge,因为我们需要通过nginx的方式启动这个iamge。
docker commit -a 0c5a9b5asddf8 temp2
。我们再次根据改完之后的container生成了一个temp2。
docker rm webserver
我们删掉没用的container。
docker run -it --volumes-from temp2 --name webserver -p 80:80 -d nginx
。
这样就完成了。--volumes-from 参数是可以允许我们从另一个容器当中挂载容器中已经创建好的数据卷。
- 0b559b5addf8是我们webserver container的id
- 具体的命令可以看https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/--volumes-from.html
以上是关于前端到docker入门的主要内容,如果未能解决你的问题,请参考以下文章