1,将两个docker 链接起来node
首先须要搭建环境: python
在alpine下面建立mariadb数据库: mysql
http://blog.csdn.net/freewebsys/article/details/53540615 web
用户名密码是root。 sql
而后建立http的Python环境: docker
http://blog.csdn.net/freewebsys/article/details/53509676 数据库
接下来作一个简单数据查询和插入操做。flask
2,python代码:bash
main.pyapp
#!/usr/bin/python# -*- coding: utf-8 -*-from flask import Flaskimport MySQLdb app = Flask(__name__) mysql_host ="mysql"mysql_user = "root"mysql_pwd = "root"mysql_db_name = "demo"""" CREATE DATABASE `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE TABLE `demo`.`user_info` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(200) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; """def query_db(sql): db = MySQLdb.connect(mysql_host, mysql_user, mysql_pwd, mysql_db_name) cur = db.cursor() try: cur.execute(sql) result = cur.fetchall() except: print("error: sql:" + sql) cur.close() db.close() return resultdef update_db(sql): print(sql) db = MySQLdb.connect(mysql_host, mysql_user, mysql_pwd, mysql_db_name) cur = db.cursor() try: cur.execute(sql) except: print("error: sql:" + sql) db.commit() cur.close() db.close()@app.route("/list")def list(): results = query_db(" select id,name from `demo`.`user_info` ") out ="results:\n" for result in results: id = result[0] name = result[1] out += "id:" + str(id) + ",name:" + name +"\n" return out@app.route("/add")def add(): sql = " insert ignore into `demo`.`user_info`(`name` ) values ('zhangsan') " update_db(sql) return "ok"if __name__ == "__main__": app.run(host='0.0.0.0', port=5000)
代码和以前的http没有太大区别,只是增长了数据库的查询和插入操做。
一共就有两个url,一个list,查询所有数据,一个add,写死增长。
3,建立数据库表
MySQL须要建立下数据库和表:
CREATE DATABASE `demo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;CREATE TABLE`demo`.`user_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(200) DEFAULT NULL,PRIMARY KEY(`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这个user_info表一共就有两个字段,一个id自增,一个是name字符串的。
固然这个数据库不在本地,是另外的一个Docker 容器。
http在一个容器上面。
4,使用link链接起来
数据建立名称叫mariadb。
跑http。
docker run -d -p 5000:5000 --name py-http --link mariadb:mysql demo/py-http:1.0
特别注意这里的–link 容器名:昵称,而后对于py-http容器来讲mysql就是昵称了。
能够直接看下evn环境:
# docker exec -it py-http
bashbash-4.3# env
HOSTNAME=db7f7aba7c2f
MYSQL_ENV_MYSQL_ROOT_PASSWORD=root
MYSQL_ENV_MARIADB_VERSION=10.1.19+maria-1~jessie
MYSQL_ENV_GOSU_VERSION=1.7
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_ENV_MARIADB_MAJOR=10.1
MYSQL_PORT_3306_TCP=tcp://172.17.0.2:3306
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
TZ=Asia/Shanghai
SHLVL=1HOME=/root
MYSQL_NAME=/py-http/mysql
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2
MYSQL_PORT=tcp://172.17.0.2:3306
_=/usr/bin/env
能够看到,在py-http容器下面已经把mariadb容器的环境变量直接引入了。
而且查看hosts:
# cat /etc/hosts
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 mysql 48bd5fbf3ddc mariadb
172.17.0.3 db7f7aba7c2f
能够看到有了mysql变量的host了。
在外部访问:就说明测试成功。数据库能插入查询了。
# curl http://127.0.0.1:5000/add
ok[root@localhost http]# curl http://127.0.0.1:5000/list
results:
id:1,name:zhangsan
id:2,name:zhangsan
4,总结
docker设计的挺好的,每个容器虽然独立,可是还能够链接起来。
这样组成一个微服务的集群。经过环境变量,把代码和环境分离。
保证测试环境,开发环境,线上环境的的一致。
极大的方便了开发运维,link 命令也很是好使。
新智云官网www.enncloud.cn