很多人都听过docker,可是却没有动手去实践。如果你没有实践过docker,那么你可以跟着这篇文章一步一步操作实践,从而入门docker。
docker是什么
先说说我的理解,docker可以理解为一个虚拟机,但是它比虚拟机更快,而我们在里面的容器相当于一个操作系统,镜像相当于一个应用程序。当然,这只是简单的比喻性的理解,并不真正是docker底层的原理。
假如,现在我们有一个项目,项目前端用的是react,后端用了koa,数据库用了mysql,那么现在让我们搭建一个工程,工程文件目录如下:
注意圈出来的几个文件,只要配置好这几个文件,那么你的项目就可以轻松的在docker中跑起来了。
前端项目
我们将react模板打包后的文件放进web_react文件夹里,编辑web_react文件夹里的Dockerfile文件,Dockerfile文件内容如下:
FROM nginx //nginx镜像
COPY ./ /usr/share/nginx/html //把当前目录文件放在镜像/usr/share/nginx/html中,其实这个目录就是一个linux系统的文件目录
EXPOSE 80 //暴露80端口
后端项目
这里使用koa-generator
生成一个koa模板,项目名为koa_api,然后进入koa_api中,编辑其Dockerfile
文件。如果你是在这个后端项目上进行开发的,这时候创建.dockerignore
,这个文件的作用是把node_modules等文件夹在docker build
的时候忽略掉。因为这些文件可以在创建镜像时执行命令npm install 直接生成,如果把这些文件打包进入镜像中,在docker build过程会执行很慢。
Dockerfile文件:
FROM node:12-alpine
COPY ./ /usr/local/app
WORKDIR /usr/local/app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
.dockerignore文件:
node_modules
数据库
一个完整的web应用有了网页和api,还需要一个数据库,这里选择myql,新建一个mysqlData的文件夹,该文件夹可以理解为把镜像数据库的数据映射出来,从而加以保存数据。
好了,这时候就要为各个项目创建镜像和容器。
首先,我们进入web_react文件夹,使用cmd命令
docker image build ./ -t web_react:1.0.0
这条命令的意思是基于 ./路径创建一个名为web_react的镜像,该镜像版本为1.0.0
你可以使用docker images来查看本机已有的镜像
这时候,你要启动这个镜像就需要一个容器,使用以下命令
docker run -it -d -p 8080:80 web_react:1.0.0
这条命令中-d
指后台启动,-p
将主机8080端口映射到容器80端口,web_react
是镜像名称
这时候你在浏览器中输入localhost:8080进行页面浏览。
docker ps 可以查看所有容器。
然后在进入koa_api文件夹中,执行和web_react同样的指令。
这时候,你发现,每次都要进去项目中输入命令,不断的创建镜像,生成容器,启动容器,这样子操作非常的繁琐麻烦。这时候docker-compose
上场了。docker-compose
可以根据配置文件docker-compose.yml
,通过一条命令直接创建多个镜像和容器。
如果你安装的是Docker Desktop,那么docker-compose是不需要重新安装的,如果其他的需要自行安装。
docker-compose.yml
我们在三个项目外面创建一个文件docker-compose.yml
该文件内容为
version: "2"
services:
koa_api: //服务名称
build: ./koa_api //基于koa_api文件夹中的DockerFile创建镜像
restart: always
working_dir: /usr/local/app //当前的工作目录
networks:
- frontend //为了和mysql处于一个共享网络状态
ports:
- "8081:3000" //映射端口,第一个为你电脑主机的端口,第二个是你镜像暴露的端口
command: npm run start //启动koa项目
depends_on:
- mysql //先创建mysql镜像和容器
mysql:
image: mysql:5.6
restart: always
networks:
- frontend
volumes:
- ./mysqlData:/var/lib/mysql //volumes的作用可以共享磁盘,这样镜像中mysql的数据会保存在磁盘中,不会丢失
environment:
- MYSQL_ROOT_PASSWORD=123 //root用户的密码
- MYSQL_DATABASE=test //创建了test数据库
ports:
- "3306:3306" //如果你电脑本身安装了mysql,这时候需要把3306端口改一下,比如改为“3307:3306”
web_react:
build: ./web_react
restart: always
volumes:
- ./web_react:/usr/share/nginx/html //这里共享磁盘,如果你react项目修改了某些代码重新打包后,直接放入web_react中就行了,这样就不用重新创建镜像,不然镜像中的文件是不可写的
ports:
- "8082:80"
depends_on:
- koa_api
networks:
frontend:
external: true
这时候执行下面命令
docker network create frontend //在docker内创建一个fontend的网络
docker-compose up -d
docker-compose up -d
这句命令是根据docker-compose.yml
文件后台启动所有容器,这时候,你在浏览器输入localhost:8080
和localhost:8081
进行页面浏览,用Navicat for MySQL等工具可以连接到容器中的数据库。
如果你数据库不想暴露端口,不想外部进行访问,那么你像上面那样子设置networks
,让你的后端项目和数据库在docker内处于同一网络下,然后后端连接数据库的host地址时用服务名称。
后记
这只是模拟一个完整的前后端分离的项目的docker实战,当然,要用得好docker还是得从原理出发。如果只是简单的使用docker,那么你去了解Dockerfile
和docker-compose.yml
这两个文件的配置,那样子也可以把docker应用在我们自己的项目中。如果你忘记了docker和docker-compose的命令,可以使用docker --help和docker-compose --help进行查看
docker --help
docker-compose --help
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。