Docker是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ sudo yum makecache fast
$ sudo yum -y install docker-ce
$ sudo systemctl start docker
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
$ docker images
$ docker ps
,如果想要查看已经关闭的镜像可以加上-a
参数$ docker rmi
,强行删除加上-f
参数$ docker rm
,强行删除加上-f
参数$ docker build -t .
,.
表示当前路径,可以使用具体路径代替$ docker run -p <本机端口>: --name -d
;-d参数表示在后台运行容器,并返回容器ID$ docker exec -it /bin/bash
;-i
以交互模式运行容器、-t
为容器重新分配一个伪输入终端$ docker tag
$ docker logs
链接地址
-- init.sql --
drop database if exists starwars;
create DATABASE starwars;
use starwars;
create table if not exists people (
_id INT NOT NULL AUTO_INCREMENT,
ID char(100),
Name char(100),
Heigth char(100),
Mass char(100),
Hair_color char(100),
Skin_color char(100),
Eye_color char(100),
Birth_year char(100),
Gender char(100),
Homeworld char(100),
Films char(200),
Species char(200),
Vehicles char(200),
Starships char(200),
primary key(_id)
);
……
……
Dockerfile
文件MYSQL_ALLOW_EMPTY_PASSWORD
便于我们对数据库进行数据导入的操作,然后将文件(相对/绝对路径)拷贝到容器中,最后执行脚本写入数据。 FROM mysql:5.7
# no password
ENV MYSQL_ALLOW_EMPTY_PASSWORD yes
# put the file to container
COPY setup.sh /mysql/setup.sh
COPY data/mysql/priviledges.sql /mysql/priviledges.sql
COPY sql/init.sql /mysql/init.sql
# command
CMD ["sh", "/mysql/setup.sh"]
具体Dockerfile语法参见链接
#!/bin/bash
set -e
#查看mysql服务的状态,方便调试,这条语句可以删除
echo `service mysql status`
echo '1.启动mysql....'
#启动mysql
service mysql start
sleep 3
echo `service mysql status`
echo '2.开始导入数据....'
#导入数据
mysql < /mysql/init.sql
echo '3.导入数据完毕....'
sleep 3
echo `service mysql status`
#重新设置mysql密码
echo '4.开始修改密码....'
mysql < /mysql/priviledges.sql
echo '5.修改密码完毕....'
#sleep 3
echo `service mysql status`
echo 'mysql容器启动完毕,且数据导入成功'
tail -f /dev/null
use mysql;
select host, user from user;
-- 因为mysql版本是5.7,因此新建用户为如下命令:
create user starwars identified by 'starwars';
-- 将starwars数据库的权限授权给创建的starwars用户,密码为starwars:
grant all on starwars.* to starwars@'%' identified by 'starwars' with grant option;
-- 这一条命令一定要有:
flush privileges;
--name
参数指定容器名称,所以随机生成了一个名字brave_agnesi
docker logs
命令查看日志:priviledges.sql
文件中的用户名密码select * from film;
#源镜像
FROM golang:latest
#设置工作目录
WORKDIR $GOPATH/src/github.com/Go-GraphQL-Group/GraphQL-Service
#将服务器的go工程代码加入到docker容器中
ADD . $GOPATH/src/github.com/Go-GraphQL-Group/GraphQL-Service
#go构建可执行文件
RUN go get github.com/Go-GraphQL-Group/GraphQL-Service
RUN go build .
# 设置 PORT 环境变量
ENV PORT 9090
#暴露端口
EXPOSE 9090
#最终运行docker的命令
ENTRYPOINT ["./GraphQL-Service"]
此时,我们已经得到了三个镜像(starwars_client(重命名得到)、starwars_db、starwars_server),每个镜像都可以在各自的容器中正常运行,但是三个容器相互独立,前端容器无法获取后端服务,后端也无法从数据库中获取服务。例如:
npm start
在项目根目录下启动,此时前端可以访问后台服务,端口为8080
。admin-password
)直接写入到后台代码,并没有存储到数据库中。此时,我们便需要运用到容器间通信的内容。
同主机下容器间通信,此篇文章讲解的比较详细,传送门。关于容器间通信的方法,可以参见此文章,传送门。我们小组在实现的过程中,使用--link
参数完成通信。
starwars_server与starwars_db通信具体实现如下:
starwars_db
mysql镜像启动容器,并命名为starwars_db
:starwars_server
,然后使用该镜像启动容器,命名为starwars_server
,并指定--link
参数:--link
参数格式为:
。而我们修改的配置文件host
即为container alias
npm start
启动的前端),由下图可知,成功获取数据。starwars_client与starwars_server通信具体实现如下:
SERVER_ADDR
修改为http://starwars_server:9090
starwars_client
容器时加上--link
指定关联的容器(starwars_server:starwars_server
):starwars_client
访问后台服务,80端口
此时,我们已经完成了三个容器之间的通信,并实现了该项目的功能。但是,这样的操作过于繁琐,而且当容器过多时会更加难以部署。所以,我们需要用到docker-compose
来部署应用。
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
docker-compose安装
version: "3.3"
services:
database:
image: starwars_db:latest
container_name: starwars_db
restart: always
ports:
- "3306:3306"
server:
depends_on:
- database
image: starwars_server:latest
container_name: starwars_server
restart: always
ports:
- "9090:9090"
external_links:
- starwars_db:starwars_db
client:
depends_on:
- database
- server
image: starwars_client:latest
container_name: starwars_client
restart: always
ports:
- "80:80"
external_links:
- starwars_server:starwars_server
在上述配置中,我们定义了三个服务:database、server、client,分别对应于我们所创建的三个镜像:starwars_db,starwars_server,starwars_client。
depends_on:
由于server服务依赖于database,所以我们使用depends_on
来管理依赖,表示server在database启动后在启动。client依赖也类似处理。
container_name:
此属性即为我们创建容器时的容器名称,用于external_links
标识。
external_links:
此属性即为我们之前使用的--link
,管理容器间通信。
docker-compose.yml
所在目录运行docker-compose up -d
。docker tag
docker push liuyh73/starwars_XXX
推送到自己的Docker Hub
仓库中。如果提示没有登录,则可以使用docker login
进行登录。docker-compose.yml
# 修改image
version: "3.3"
services:
database:
image: liuyh73/starwars_db:latest
container_name: starwars_db
restart: always
ports:
- "3306:3306"
server:
depends_on:
- database
image: liuyh73/starwars_server:latest
container_name: starwars_server
restart: always
ports:
- "9090:9090"
external_links:
- starwars_db:starwars_db
client:
depends_on:
- database
- server
image: liuyh73/starwars_client:latest
container_name: starwars_client
restart: always
ports:
- "80:80"
external_links:
- starwars_server:starwars_server
完整代码详见Github