配置
在上一节的基础上, 增加如下的docker-compose.yml文件, 然后用docker-compose up命令启动容器进行部署:
1 version: "3" 2 services: 3 server: 4 image: update/server:v0.1 5 labels: 6 description: "tcp server test script" 7 restart: always 8 command: -p 3000 9 10 worker: 11 image: update/worker:v0.1 12 labels: 13 description: "tcp client test script" 14 restart: always 15 links: 16 - server:server 17 command: -d server -p 3000
启动信息:
1 linux:/app # docker-compose up 2 Creating network "app_default" with the default driver 3 Creating app_server_1_17e8cbeb1e01 ... done 4 Creating app_worker_1_bd97b9199c60 ... done 5 Attaching to app_server_1_74e7ece79785, app_worker_1_bb9dcc04daf9 6 7 8 linux:/app/original/server # docker ps 9 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 10 81211aa6383c update/worker:v0.1 "python worker.py ..." About a minute ago Up About a minute app_worker_1_bb9dcc04daf9 11 76c322567db7 update/server:v0.1 "python server.py ..." About a minute ago Up About a minute app_server_1_74e7ece79785 12 linux:/app/original/server # docker exec ^C 13 linux:/app/original/server # docker exec 81211aa6383c ss -a | grep 3000 14 tcp ESTAB 0 0 172.18.0.3:52448 172.18.0.2:3000 15 linux:/app/original/server # docker exec 76c322567db7 ss -a | grep 3000 16 tcp LISTEN 0 5 *:3000 *:* 17 tcp ESTAB 0 0 172.18.0.2:3000 172.18.0.3:52448 18 linux:/app/original/server # docker exec 76c322567db7 tail -f /update/server/log/server.log 19 2018-11-19 09:35:59 [INFO] Waiting for connection... 20 2018-11-19 09:36:00 [INFO] ('172.18.0.3', 52448) connected 21 tail: unrecognized file system type 0x794c7630 for '/update/server/log/server.log'. please report this to bug-coreutils@gnu.org. reverting to polling 22 ^C 23 linux:/app/original/server # docker exec 81211aa6383c tail -f /update/worker/log/worker.log 24 tail: unrecognized file system type 0x794c7630 for '/update/worker/log/worker.log'. please report this to bug-coreutils@gnu.org. reverting to polling 25 2018-11-19 09:38:30 [INFO] [recv] hello, docker! 26 2018-11-19 09:38:35 [INFO] [recv] hello, docker! 27 2018-11-19 09:38:40 [INFO] [recv] hello, docker! 28 ^C 29 linux:/app/original/server # 30 linux:/app # docker-compose -f docker-compose.yml down 31 Stopping app_worker_1_bd97b9199c60 ... done 32 Stopping app_server_1_17e8cbeb1e01 ... done 33 Removing app_worker_1_bd97b9199c60 ... done 34 Removing app_server_1_17e8cbeb1e01 ... done 35 Removing network app_default 36 linux:/app #
支持环境变量传参
在上面的基础上,把命令行传参的方式改为通过环境变量传参:
1 FROM jason/debian-python27:v1.0 2 3 MAINTAINER jason<djsxut@163.com> 4 5 RUN mkdir -p /env/server 6 7 COPY . /env/server 8 9 WORKDIR /env/server 10 11 ENV PATH $PATH:/env/server 12 13 ENTRYPOINT ["python", "server.py"]
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import os 5 import sys 6 import time 7 import socket 8 import select 9 import signal 10 import threading 11 12 log_file = "log/server.log" 13 14 def log(msg): 15 if not os.path.exists("log"): 16 os.mkdir("log") 17 with open(log_file, "a") as wf: 18 wf.writelines( 19 time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) + 20 " [INFO] " + msg + " ") 21 22 def do_listen(port): 23 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 24 server_socket.bind(('', port)) 25 server_socket.listen(5) 26 print 'Waiting for connection...' 27 log('Waiting for connection...') 28 server_socket.setblocking(0) 29 30 rfd = [server_socket, ] 31 32 while True: 33 rlist, wlist, xlist = select.select(rfd, [], []) 34 for sock in rlist: 35 if sock == server_socket: 36 newsock, addr = server_socket.accept() 37 print '[+] %s connected' % str(addr) 38 log('%s connected' % str(addr)) 39 rfd.append(newsock) 40 else: 41 data = sock.recv(1024) 42 if data: 43 sock.send(data) 44 else: 45 print '[-] %s closed' % str(sock.getpeername()) 46 log('%s closed' % str(sock.getpeername())) 47 rfd.remove(sock) 48 sock.close() 49 50 def signal_handler(signum, frame): 51 print ' [-] signal(%d) received, exit!' % signum 52 log('signal(%d) received, exit!' % signum) 53 sys.exit(-1) 54 55 if __name__ == '__main__': 56 try: 57 port = int(os.environ['APP_PORT']) 58 except: 59 print '[-] environment APP_PORT should be set' 60 log('environment APP_PORT should be set') 61 sys.exit(-1) 62 63 signal.signal(signal.SIGINT, signal_handler) 64 65 try: 66 do_listen(port) 67 except Exception, e: 68 print e 69 print ' Exit'
1 FROM jason/debian-python27:v1.0 2 3 MAINTAINER jason<djsxut@163.com> 4 5 RUN mkdir -p /env/worker 6 7 COPY . /env/worker 8 9 WORKDIR /env/worker 10 11 ENV PATH $PATH:/env/worker 12 13 ENTRYPOINT ["python", "worker.py"]
1 #!/usr/bin/python 2 # -*- coding: utf-8 -*- 3 4 import os 5 import sys 6 import time 7 import socket 8 import signal 9 import getopt 10 import threading 11 12 log_file = "log/worker.log" 13 14 def log(msg): 15 if not os.path.exists("log"): 16 os.mkdir("log") 17 with open(log_file, "a") as wf: 18 wf.writelines( 19 time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time())) + 20 " [INFO] " + msg + " ") 21 22 class Handler: 23 def __init__(self, domain, port): 24 self.domain = domain 25 self.port = port 26 self.sock = None 27 28 def get_socket(self): 29 for res in socket.getaddrinfo(self.domain, self.port, 30 socket.AF_INET, socket.SOCK_STREAM): 31 family, socktype, proto, canonname, sa = res 32 try: 33 self.sock = socket.socket(family, socktype, proto) 34 #self.sock.setblocking(0) 35 #sock.settimeout(0.5) 36 self.sock.connect(sa) 37 except socket.error, msg: 38 if self.sock != None: 39 self.sock.close() 40 self.sock = None 41 else: 42 return True 43 44 return False 45 46 def do_handler(self): 47 while self.sock == None and self.get_socket() == False: 48 print '[-] connect failed...' 49 log('connect failed...') 50 time.sleep(5) 51 52 print '[+] %s connected' % str(self.sock.getpeername()) 53 log('[+] %s connected' % str(self.sock.getpeername())) 54 while True: 55 # do something 56 self.sock.send('hello, docker!') 57 data = self.sock.recv(1024) 58 if data: 59 print '[+][recv] %s' % data 60 log('[recv] %s' % data) 61 time.sleep(5) 62 else: 63 print '[-] server closed, exit' 64 log('server closed, exit') 65 self.sock.close() 66 self.sock = None 67 break 68 69 def signal_handler(signum, frame): 70 print ' [-] signal(%d) received, exit!' % signum 71 log('signal(%d) received, exit!' % signum) 72 sys.exit(-1) 73 74 if __name__ == '__main__': 75 signal.signal(signal.SIGINT, signal_handler) 76 77 try: 78 domain = os.environ['APP_DOMAIN'] 79 port = int(os.environ['APP_PORT']) 80 except: 81 print '[-] environment APP_PORT/APP_DOMAIN should be set' 82 log('environment APP_PORT/APP_DOMAIN should be set') 83 sys.exit(-1) 84 85 try: 86 handler = Handler(domain, port) 87 handler.do_handler() 88 except Exception, e: 89 print e 90 print ' Exit'
简单修改下docker-compose.yml文件:
1 version: "3" 2 services: 3 server: 4 image: env/server:v0.1 5 build: 6 context: /app/env/server 7 dockerfile: Dockerfile 8 labels: 9 description: "tcp server test script" 10 restart: always 11 environment: 12 - APP_PORT=${APP_PORT-3000} 13 volumes: 14 - /app/env/server/log:/env/server/log 15 16 worker: 17 image: env/worker:v0.1 18 build: /app/env/worker 19 labels: 20 description: "tcp client test script" 21 restart: always 22 links: 23 - server 24 environment: 25 - APP_PORT=${APP_PORT-3000} 26 - APP_DOMAIN=server 27 volumes: 28 - /app/env/worker/log:/env/worker/log 29 deploy: 30 replicas: 3
执行结果如下所示:
1 linux:/app/env/server # APP_PORT=5000 docker-compose up -d 2 WARNING: Some services (worker) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm. 3 Creating network "env_default" with the default driver 4 Building server 5 Step 1/7 : FROM jason/debian-python27:v1.0 6 ---> cd0b2f7d8d04 7 Step 2/7 : MAINTAINER jason<djsxut@163.com> 8 ---> Using cache 9 ---> d239a9d50575 10 Step 3/7 : RUN mkdir -p /env/server 11 ---> Running in f1802bbbf5f8 12 ---> b196dec5ece6 13 Removing intermediate container f1802bbbf5f8 14 Step 4/7 : COPY . /env/server 15 ---> 789a69dde7bc 16 Removing intermediate container 53d720f6e28d 17 Step 5/7 : WORKDIR /env/server 18 ---> 8bc3b957a769 19 Removing intermediate container dfd8c4cecd45 20 Step 6/7 : ENV PATH $PATH:/env/server 21 ---> Running in 0935ca701a19 22 ---> d6fdd5814444 23 Removing intermediate container 0935ca701a19 24 Step 7/7 : ENTRYPOINT python server.py 25 ---> Running in 9209e05da1a9 26 ---> c34b7a72cb0b 27 Removing intermediate container 9209e05da1a9 28 Successfully built c34b7a72cb0b 29 WARNING: Image for service server was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. 30 Building worker 31 Step 1/7 : FROM jason/debian-python27:v1.0 32 ---> cd0b2f7d8d04 33 Step 2/7 : MAINTAINER jason<djsxut@163.com> 34 ---> Using cache 35 ---> d239a9d50575 36 Step 3/7 : RUN mkdir -p /env/worker 37 ---> Running in de82f380b738 38 ---> 480f67b5dc6a 39 Removing intermediate container de82f380b738 40 Step 4/7 : COPY . /env/worker 41 ---> c7b98717c8c8 42 Removing intermediate container 1d0857c192e6 43 Step 5/7 : WORKDIR /env/worker 44 ---> a6cedc9734a0 45 Removing intermediate container cd648d954ada 46 Step 6/7 : ENV PATH $PATH:/env/worker 47 ---> Running in 977e0045899e 48 ---> 5d20c078708d 49 Removing intermediate container 977e0045899e 50 Step 7/7 : ENTRYPOINT python worker.py 51 ---> Running in 3f92d15c16f0 52 ---> bd3579c73bd3 53 Removing intermediate container 3f92d15c16f0 54 Successfully built bd3579c73bd3 55 WARNING: Image for service worker was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. 56 Creating env_server_1_be9373e6fe83 ... done 57 Creating env_worker_1_e4e9c2ece128 ... done 58 linux:/app/env/server # 59 linux:/app/env/server # 60 linux:/app/env/server # docker images | grep env 61 env/worker v0.1 bd3579c73bd3 19 seconds ago 207MB 62 env/server v0.1 c34b7a72cb0b 22 seconds ago 207MB 63 linux:/app/env/server # docker ps 64 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 65 93c7d5f760e8 env/worker:v0.1 "python worker.py" 20 seconds ago Up 19 seconds env_worker_1_57f3186eefba 66 0712a2615e12 env/server:v0.1 "python server.py" 21 seconds ago Up 20 seconds env_server_1_1615d4c9ff54 67 linux:/app/env/server # cat log/server.log 68 2018-11-20 02:41:32 [INFO] Waiting for connection... 69 2018-11-20 02:41:33 [INFO] ('172.18.0.3', 38708) connected 70 linux:/app/env/server # cat ../worker/log/worker.log 71 2018-11-20 02:41:33 [INFO] [+] ('172.18.0.2', 5000) connected 72 2018-11-20 02:41:33 [INFO] [recv] hello, docker! 73 linux:/app/env/server # docker-compose down 74 WARNING: Some services (worker) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm. 75 Stopping env_worker_1_57f3186eefba ... done 76 Stopping env_server_1_1615d4c9ff54 ... done 77 Removing env_worker_1_57f3186eefba ... done 78 Removing env_server_1_1615d4c9ff54 ... done 79 Removing network env_default 80 linux:/app/env/server #