很多人都听过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 该文件内容为
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 复制代码