从一次实践入门docker

1,331 阅读5分钟

很多人都听过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:8080localhost:8081进行页面浏览,用Navicat for MySQL等工具可以连接到容器中的数据库。

如果你数据库不想暴露端口,不想外部进行访问,那么你像上面那样子设置networks,让你的后端项目和数据库在docker内处于同一网络下,然后后端连接数据库的host地址时用服务名称。

后记

这只是模拟一个完整的前后端分离的项目的docker实战,当然,要用得好docker还是得从原理出发。如果只是简单的使用docker,那么你去了解Dockerfiledocker-compose.yml这两个文件的配置,那样子也可以把docker应用在我们自己的项目中。如果你忘记了docker和docker-compose的命令,可以使用docker --help和docker-compose --help进行查看

docker --help

docker-compose --help