Docker – חלק חמישי

בפרק הקודם הדגמתי הרצת שתי פקודות במיכל (באמצעות הפקודה docker run): האחת איפשרה גישה אינטרקטיבית לעבודה עם המיכל ובשניה הרצנו Daemon שסיפק שירות.

כרגע אתמקד בעבודה עם docker client. עבודה עם docker client מאוד פשוטה (באמצעות דגלים וארגומנטים ניתן לשלוט בהוראות ל- Docker Client):

[Usage: [sudo] docker [command] [flags] [arguments …

הרצת הפקודה docker version תספק לנו אינפורמציה נוספת על גרסת docker בצד השרת ובצד הלקוח (בצד אינפורמציה רבה נוספת).

$ sudo docker version
[sudo] password for ilan:
Client version: 1.3.2
Client API version: 1.15
Go version (client): go1.3.3
Git commit (client): 39fa2fa
OS/Arch (client): linux/amd64
Server version: 1.3.2 Server
API version: 1.15
Go version (server): go1.3.3
Git commit (server): 39fa2fa;

כדי לקבל עזרה על פקודה מסויימת (נניח attach) נוסיף את הדגל

$ sudo docker attach –help
Usage: docker attach [OPTIONS] CONTAINER

Attach to a running container
–no-stdin=false Do not attach STDIN
–sig-proxy=true Proxy all received signals to the process (even in non-TTY mode). SIGCHLD, SIGKILL, and SIGSTOP are not proxied.

הערה: כדי לצפות בכל באפשרויות שהפקודה docker תומכת יש להריץ את הפקודה docker בלבד.
הרצת אפליקציית רשת באמצעות docker:

$ sudo docker run -d -P training/webapp python app.py
Unable to find image 'training/webapp' locally
Pulling repository training/webapp
31fa814ba25a: Download complete
511136ea3c5a: Download complete
f10ebce2c0e1: Download complete
82cdea7ab5b5: Download complete
5dbd9cb5a02f: Download complete
74fe38d11401: Download complete
64523f641a05: Download complete
0e2afc9aad6e: Download complete
e8fc7643ceb1: Download complete
733b0e3dbcee: Download complete
a1feb043c441: Download complete
e12923494f6a: Download complete
a15f98c46748: Download complete
Status: Downloaded newer image for training/webapp:latest
52d212d850c52cf8553f729ecc0850647d1bb50f274f6ef9316ea19b3d3b7fe5

  • הדגל d- מוכר: האפליקציה במיכל תורץ ברקע ותספק את השירות
  • הדגל p- מציין שיש למפות כל פורט נדרש במיכל ולשייך אותו למיכל הנוכחי
  • מאחר שהמיכל 'training/webapp' לא נמצא במאגר המקומי, הוא הורד מהרשת (Docker Hub). המיכל מכיל סקריפט פייתון פשוט (app.py) שמיישם אפליקצית רשת.

נריץ שוב את הפקודה docker ps (הפעם עם הדגל l- בו נבקש לקבל מידע נוסף על זמן הרצת הסקריפט)

$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

2d212d850c5 training/webapp:latest "python app.py" 11 minutes ago Up 11 minutes 0.0.0.0:49153->5000/tcp clever_lumiere

הערה: הפורט 49153 בצד הלקוח מופה לפורט 5000 בצד השרת.

נגלוש לכתובת זאת ונקבל את המסך הבא:

webapp1

כדי לצפות בלוגים של השרת נריץ את הפקודה הבאה:

$ sudo docker logs -f clever_lumiere
* Running on http://0.0.0.0:5000/
172.17.42.1 – – [07/Dec/2014 03:49:33] "GET / HTTP/1.1" 200 –
172.17.42.1 – – [07/Dec/2014 03:49:34] "GET /favicon.ico HTTP/1.1" 404 –
172.17.42.1 – – [07/Dec/2014 03:50:04] "GET / HTTP/1.1" 200 –
172.17.42.1 – – [07/Dec/2014 03:50:04] "GET /favicon.ico HTTP/1.1" 404 –
172.17.42.1 – – [07/Dec/2014 03:50:04] "GET /favicon.ico HTTP/1.1" 404 –

הערה: הדגל f- גורם ל- docker להתנהג כמו הפקודה tail -f (כלומר להמשיך להאזין ללוגים ולא לצאת מהמשימה בסיום הרצת הפקודה).

כדי לצפות בתהליכים הרצים בתוך המיכל נריץ את הפקודה top:

$ sudo docker top clever_lumiere
UID PID PPID C STIME TTY TIME CMD
root 23777 1774 0 05:33 ? 00:00:00 python app.py

ניתן להבחין שהפקודה python app.py היא הפקודה היחידה שרצה במיכל.

כדי לעצור את עבודת המיכל נריץ את הפקודה הבאה:

$ sudo docker stop clever_lumiere
clever_lumiere

אם נרצה להריץ שוב את המיכל יש לנו שתי אפשרויות: לחדש את ריצת המיכל (מאותה הנקודה שרץ בעבר) או לאתחל אותו:

~$ sudo docker start clever_lumiere
clever_lumiere

נריץ שוב את הפקודה pocker ps -l וניראה שהמיכל רץ כבר 41 דקות – כלומר חידשנו את פעולתו.

$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52d212d850c5 training/webapp:latest "python app.py" 41 minutes ago Up 50 seconds 0.0.0.0:49154->5000/tcp clever_lumiere

לעומת זאת הפקודה restart תגרום להפסקת פעולת המיכל וריצתו מחדש (מאפס):

$ sudo docker restart clever_lumiere

כפי שניתן להיווכח:

$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
52d212d850c5 training/webapp:latest "python app.py" 44 minutes ago Up 2 seconds 0.0.0.0:49155->5000/tcp clever_lumiere

כדי להסיר את המיכל יש תחילה לעצור אותו (stop) ורק לאחר מכן נוכל להסיר אותו באמצעות בפקודה rm:

$ sudo docker rm clever_lumiere
Error response from daemon: You cannot remove a running container. Stop the container before attempting removal or use -f
2014/12/07 06:21:14 Error: failed to remove one or more containers
ilan@ilan-HP-ProBook-6450b:~$ sudo docker stop clever_lumiere
clever_lumiere
ilan@ilan-HP-ProBook-6450b:~$ sudo docker rm clever_lumiere
clever_lumiere

עד לנקודה זאת תמיד השתמשנו במיכלים מוכנים שהורדנו מ- Docker Hub. בחלק הבא נלמד להכין מיכלים בעצמנו

Docker – חלק רביעי

מושג שחשוב להכיר בעבודה עם Docker הוא Docker Hub. מה זה Docker Hub ולמה הוא משמש?

  • מדובר במחסן מרכזי שמרכז את המיכלים של המשתמשים
  • מספק למשתמשים כלים לבניה וניהול של מיכלים
  • מאפשר שיתוף מיכלים עם עמיתים
  • מספק כלי ניהול ובקרת גרסאות באמצעות Github

ניתן לפתוח חשבון ב- Docker Hub בקישור הבא.
להמשיך לקרוא Docker – חלק רביעי