مشاور زیرساخت. موسس سایت آموزشی DockerMe.ir
همه چی در مورد کارگاه آموزشی داکر ۲۲ اسفندماه
سلام روزتون بخیر. اول اسفند ماه سال ۹۸ ورکشاپی به همت بچههای انجمن کامپیوتر دانشگاه خواجه نصیر با همکاری سایت آموزشی DockerMe.ir قراره برگزار بشه. احتمالا زمانی که شما دارید این پست رو میخونید برگزار شده. در کل از اونجایی که زمان خودم و دیگران خیلی برام مهمه قبل از کارگاه این متن رو آماده کردم و منتشر میکنم تا در زمان کارگاه دیگه کمتر زمان ازمون گرفته بشه و به صورت متمرکز بتونیم چند تا سناریویی که مد نظر داریم رو به خوبی پیادهسازی کنیم.
یک نکته اینکه کارگاه در تاریخ اول اسفند ماه به دلیل بروز بیماری کرونا برگزار نشد و در عوض آن در تاریخ ۲۲ اسفند ماه به صورت آنلاین برگذار شد.
ویدئوی این کارگاه در حال تبدیل است تا به صورت عمومی در اختیار قرار گیرد.
هدفمون از برگزاری کارگاه:
هدفمون این بوده که طی یه برنامهی ۴ ساعته به صورت حضوری و عملی کار با داکر رو تمرین کنیم و با توجه به تجربهی داکرمی در پروژههای خودش، سناریویی طراحی و آماده کرده که علاوه برتست موارد زیادی همزمان بشه از همون سناریوها در پروژههای خودمون هم استفاده کنیم.
این کارگاه برای چه کسانی مناسب است:
این کارگاه برای تمام افرادی که به داکر و این زیرساخت علاقمند هستند کاربرد دارد و میتوانند از آن بهره ببرند.
ویندوز یا لینوکس:
دیگه زمان این حرفا گذشته با هر چی دوست دارید بیاید فقط لپتاپ همراهتون باشه.
پیش نیاز کارگاه:
خوبه قبلش بدونید داکر چی هست و چی کار میکنه. دقیقا همایش قبلی رو اگر بتونید بررسی کنید عالیه اما اگر به منابع اون دسترسی نداشتید از سایت داکرمی میتونید شروع کنید به مطالعه و با یه آمادگی نسبی تو کارگاه باشید. البته اگر داکر رو هم نصب داشته باشید خیلی خوبه. تو سایت نحوهی نصب داکر روی ویندوز و لینوکس قبلا آموزش داده شده است.
برنامهی کارگاه:
خوب دیگه بریم سراغ برنامهی کارگاه که چی هست و قراره چی کار کنیم.
مرحلهی اول: توضیح اجمالی کامپوننتهای داکر
به صورت خیلی جزئی و در حد چند دقیقه کامپوننتهای داکر رو توضیح میدیم. البته که دونستن اونها قبل از کارگاه مهم است و بهتر که از اینجا این موارد رو بررسی کنید.
مرحلهی دوم: نصب داکر
در این مرحله با استفاده از docker desktop رو ویندوز و با استفاده از سایت get.docker.com بر روی لینوکس نصب داکر رو دنبال میکنیم. برای این قسمت دو ویدئو داریم که قبلا اونجا نصب رو کامل توضیح دادیم. نصب ویندوز اینجا و نصب لینوکس رو میتونید اینجا مشاهده کنید.
خیلی از مواقع پیش می آید که شما نیاز داشته باشید کانفیگ سرویس داکر خود را تغییر دهید و از کانفیگ پیشفرض داکر استفاده نکنید. از موارد مهمی که معمولا تغییر آنها انجام میشود عبارتاست از:
- کانفیگ mirror registry
- تغییر شبکهی پیشفرض داکر
- تغییر دایرکتوری پیشفرض داکر
برای کانفیگ سرویس برای ویندوز و در زمان استفاده از docker desktop بر روی خود سرویس قسمت تنظیمات داره که اونجا میتونیم این موارد رو کانفیگ کنیم. اما بیشتر این تنظیمات روی سرور و روی لینوکس مد نظر میباشد.
برای انجام تنظیمات روی لینوکس به این نکات دقت کنید.
به صورت کلی دو راه برای کانفیگ سرویس داکر وجود دارد که روش اول ایجاد فایل و کانفیگ سرویس از طریق مسیر etc/default/docker/daemon.json/ است و دومی از مسیر systemd که مربوط به کانفیگ سرویس systemctl خود داکر میشود. با توجه به علاقهی شخصی خودم بیشتر از روش دوم برای کانفیگ استفاده میکنم. حالا برای کانفیگ داکر بعد از نصب آن ابتدا میبایست دایرکتوری و فایل زیر را ایجاد کنیم. اسم فایل مهم نیست و هر فایلی داخل دایرکتوری مذکور ایجاد شود و syntax درستی داشته باشد داخل سرویس داکر لود میشود. این روش برای کانفیگ همهی سرویسهایی که با systemctl کنترل میشوند سازگار است.
mkdir -p /etc/systemd/system/docker.service.d
touch /etc/systemd/system/docker.service.d/override.conf
سپس داخل فایل override.conf تمام کانفیگهای مد نظر خودمون رو قرار میدهیم. دقت کنید که ابتدای فایل میبایست با محتوای زیر کامل شود.
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
راستی با استفاده از دستور systemctl config docker هم میتونستیم کانفیگ سرویس رو انجام بدیم و خودش اون فایل کانفیگ رو برامون داخل همون مسیر ایجاد میکرد.
برای کانفیگ mirror registry خط زیر رو اضافه میکنیم.
--registry-mirror https://hub.dockerme.ir
برای تغییر ip پیشفرض داکر خط زیر رو اضافه میکنیم.
--bip 172.20.10.1/24
و برای اینکه دایرکتوری اصلی داکر رو تغییر بدیم از کانفیگ زیر استفاده میکنیم.
-g /data/docker
فایل نهایی به صورت زیر میشود:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd \
--registry-mirror https://hub.dockerme.ir \
--bip 172.20.10.1/24 \
-g /data/docker
بعد از اعمال این تغییرات فایل را ذخیره و از آن خارج شوید. سپس با استفاده از دستورات زیر سرویس داکر را راهاندازی کنید تا تغییرات شما اعمال شود.
systemctl daemon-reload
systemctl restart docker
systemctl status docker
حتما با استفاده از دستور docker info بررسی کنید تغییراتی که ایجاد کردید آیا بر روی سرویس اعمال شده است یا خیر؟
مرحلهی سوم: ایجاد یک داکرفایل و ساخت ایمیج
برای ایجاد داکرفایل حتما از این پست استفاده کنید و قبلش یه مروری روی اون داشته باشید. دیگه تقریبا هر چی لازم بوده اونجا گفتم دیگه چیزی به نظرم لازم نیست.
برای نمونه با هم یه ایمیج nginx آماده میکنیم که داکرفایلهای آن رو در اینجا قرار دادم. برای این که راحتترم باشید اینجا هم براتون قرار میدم.
FROM ubuntu:latest
LABEL maintainer="Ahmad Rafiee <ahmad@DockerMe.ir>"
RUN apt update \
&& apt install -y nginx
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
اگر بخوام به صورت خلاصه بگم که این داکرفایل داره چی کار میکنه و هر قسمت رو به صورت مجزا توضیح بدم به این صورت میباشد:
FROM ubuntu:latest
در این قسمت با استفاده از FROM داره از ایمیج ubuntu استفاده میکنه. دیگه در این داکرفایل با توجه به این ایمیج میتوان از دستورات Ubuntu استفاده کرد.
LABEL maintainer="Ahmad Rafiee <ahmad@DockerMe.ir>"
با استفاده از LABEL مشخص میکنه که نویسندهی این داکرفایل چه کسی است. معمولا داخل هر داکرفایل مشخص میکنند که نویسندهی داکرفایل چه کسی است.
RUN apt update \
&& apt install -y nginx
با استفاده از RUN داریم nginx رو نصب میکنیم دقت کنید که حتما باید تمام موارد به صورت غیر Interactive باشه که اینجا با استفاده از y- این کار انجام میشود. توجه داشته باشید که تمام اقداماتی که لازم است را در اینجا میتوانید به صورت پیوسته قرار دهید. دقت کنید که هر RUN یک لایه به ایمیج شما اضافه میکند.
# forward request and error logs to docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log
در این قسمت داریم لاگهای سرویس nginx رو تنظیم میکنیم. اگر این قسمت انجام نشود لاگهای nginx داخل خروجی کانتینر دیده نمیشود. این موضوع برای زمان رفع عیب خیلی اهمیت دارد.
EXPOSE 80
با استفاده از دستور EXPOSE پورت ۸۰ رو از کانتینر expose میکنیم. حتما به این نکته دقت کنید که داریم expose میکنیم و با publish متفاوت است. به صورت کلی در داکرفایل نمیتوان پورت را publish کرد. در یک جمله expose یعنی پورت داخل کانتینر میباشد و publish یعنی اینکه این پورت بر روی یک پورت host مپ شده و در دسترس برای استفاده میباشد.
CMD ["nginx", "-g", "daemon off;"]
نکتهی مهم اینکه همواره باید کاری کنیم که پروسههای ما در کانتینرها در Foreground قرار بگیرد که با استفاده از CMD برای سرویس nginx این کار انجام شده است. دقت کنید سرویس وجود ندارد که پروسههای ما رو کنترل کند برای همین میبایست ما پروسههای خود را در Foreground راهاندازی و نگهداری کنیم.
ساخت ایمیج با استفاده از داکرفایل:
این یک داکرفایل ساده و جمع و جور برای آماده سازی سرویس nginx است. حالا میخواهیم با استفاده از دستورات داکر و داکرفایلی که ایجاد کردیم ایمیج خود را بسازیم. با استفاده از دستور زیر میتوانیم ایمیج خود را بسازیم.
docker build -t nginx:dockerme --pull -f dockerfile-sample/nginx/Dockerfile .
با استفاده از این دستور میتوانید ایمیج خود را آماده کنید که آپشن t- برای ایمیج اسم مشخص میکند که اگر قرار ندهید یه اسم خودش برای ایمیج قرار میدهد. با استفاده از آپشن f- داریم مسیر داکرفایل و اسم اون رو مشخص میکنیم. اگر در دایرکتوری که داکرفایل با اسم Dockerfile وجود دارد قرار داشته باشید نیازی نیست که از این آپشن استفاده کنید.
دقت کنید که ما میتونیم داکرفایلهایی داشته باشیم که تغییر در ایمیجهای ما ایجاد کند و اصلاحاتی را داخل آنها انجام دهد. حالا میتونید ایمیجی که آماده شده است را داخل رجیستری خود push کنید. در ادامه که رجیستری خود رو آماده کردیم حتما این کار رو انجام می دهیم.
مرحلهی چهارم: دستورات داکر و ران کردن سرویس
خوب تا حالا یاد گرفتیم که چطور ایمیج مد نظر خودمون رو بسازیم و یا اینکه چطور بتونیم اون رو تغییر بدیم. حالا بعد از آماده سازی ایمیج لازم است تا با استفاده از دستورات داکر سرویس خودمون رو راهاندازی کنیم. قبلا یه پست در مورد استفاده از دستورات داکر نوشتم که اینجا میتونید آن را بررسی کنید. تو این سناریو آمادهسازی سرویس wordpress است که حتما بررسی کنید. حالا به صورت خلاصه دستورات مربوط به راهاندازی سرویس wordpress رو اینجا به صورت خیلی خلاصه باهم مرور میکنیم.
دریافت ایمیجهای مورد نیاز راهاندازی سرویس:
docker pull wordpress:latest
docker pull nginx:latest
docker pull mysql:5.7
ایجاد شبکهی مورد نیاز و بررسی آن:
docker network create --driver bridge --subnet=172.30.10.0/24 wp-net
docker network ls
docker inspect wp-net
ایجاد والیومهای مورد نیاز و بررسی آن:
docker volume create --driver local --name wp-data
docker volume create --driver local --name db-data
docker volume ls
docker inspect wp-data
docker inspect db-data
ایجاد دایرکتوریهای مورد نیاز برای سرویس nginx:
mkdir -p /home/ahmad/DockerMe/wp/nginx/conf.d
mkdir -p /home/ahmad/DockerMe/wp/nginx/cert
tree /home/ahmad/DockerMe/wp
راهاندازی سرویس Mysql و بررسی آن:
docker run -itd --name mysql --hostname mysql \
--network=wp-net --network-alias=db --ip=172.30.10.10 \
--restart=always --memory=512m \
--mount=source=db-data,target=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=EUEBmxTYtgrXdsdsnfHJJwE9V9fKK7Anha \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=EUEBmxTYtgrXdsdsnfHJJwE9V9fKK7Anha \
mysql:5.7
بررسی سرویس Mysql:
docker ps
docker stats mysql
docker exec -i mysql mysql -u root -pEUEBmxTYtgrXdsdsnfHJJwE9V9fKK7Anha <<< "show databases"
راهاندازی سرویس Wordpress و بررسی آن:
docker run -itd --name wordpress --hostname wordpress \
--network=wp-net --network-alias=wp --ip=172.30.10.20 \
--restart=always --memory=1024m \
--mount=source=wp-data,target=/var/www/html/ \
-e WORDPRESS_DB_PASSWORD=EUEBmxTYtgrXdsdsnfHJJwE9V9fKK7Anha \
-e WORDPRESS_DB_HOST=db:3306 \
--link mysql:db \
wordpress:latest
بررسی سرویس Wordpress:
docker ps
docker stats --no-stream
docker logs -f wordpress
curl -I -L 172.30.10.20
ایجاد فایل کانفیگ nginx:
vim /home/ahmad/DockerMe/wp/nginx/conf.d/wordpress.conf
server {
listen 80;
server_name test.dockerme.ir;
location / {
proxy_pass http://wordpress:80;
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header X-Powered-By "Ahmad Rafiee | DockerMe.ir" ;
}
}
راهاندازی سرویس Nginx و بررسی آن:
docker run -itd --name nginx --hostname nginx \
--network=wp-net --network-alias=web --ip=172.30.10.30 \
--restart=always --memory=512m \
--volume=/home/ahmad/DockerMe/wp/nginx/conf.d:/etc/nginx/conf.d \
--volume=/home/ahmad/DockerMe/wp/nginx/cert:/etc/nginx/cert \
--publish=80:80 --publish=443:443 \
--link wordpress:wp \
nginx:latest
بررسی سرویس nginx:
docker ps
docker stats --no-stream
بعد از این مرحله میبایست سرویس ما به صورت کامل راهاندازی شده باشد.
دریافت backup از سرویس mysql:
docker exec -i mysql mysqldump -u root -pEUEBmxTYtgrXdsdsnfHJJwE9V9fKK7Anha --all-databases --single-transaction --quick > full-backup-$(date +%F).sql
راستی دقت کنید قرار دادن پسورد داخل کامند کار به شدت اشتباهی است و نباید انجام بشود. حتما باید پسورد رو از شما سوال کنه و به صورت امن وارد کنید. به این نکته دقت کنید.
میتونید مجموعهی دستورات و داکر کامپوز مربوط به آن را اینجا هم ببینید و ازش استفاده کنید.
دقت کنید شما باید کار با دستورات داکر رو بدونید و بتونید باهاش کارتون رو انجام بدید. از این رو تو کارگاه ما یه سری از دستورات رو بررسی میکنیم و مهمه که شما هم دستورات داکر رو باهاش کار کنید. قبلا برای تمام دستورات داکر ویدئو و متن آماده کردیم که میتونید آنها رو در سایت DockerMe مشاهده کنید.
مرحلهی پنجم: ایجاد کامپوز فایل
خوب رسیدیم به کامپوز فایل که حتما باید باهاش آشنا باشید. تو این جلسه در حد چند دقیقه خیلی کوتاه در مورد اینکه کلا داکر کامپوز چی هست و چرا ازش استفاده میشود صحبت میکنیم که البته صحبتهای تکمیلی آن رو میتونید اینجا بررسی کنید. اما مهمتر از دستورات docker-compose نحوهی نوشتن خود کامپوزفایل است که همین چند هفتهی پیش در موردش تو این لینک به خوبی توضیح دادم.
تو این کارگاه به صورت نمونه کامپوزفایل سرویس wordpress که بالاتر با استفاده از دستورات داکر راهاندازی کردیم را مینویسیم و در مورد موارد آن صحبت میکنیم.
فایل داکر کامپوز را میتوانید از اینجا دانلود کنید که در ادامه آن را بررسی میکنیم.
---
version: '2'
services:
db:
image: mysql:5.7
restart: always
environment:
MYSQL_ROOT_PASSWORD: salamdonya
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: salamdonya
volumes:
- db:/var/lib/mysql
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- 80:80
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: salamdonya
volumes:
db:
کامپوز فایل به صورت کلی شامل یک سری سرویس میباشد که تمام موارد پیرامون آن اعم از volume و network و ارتباطات سرویسها باهم در آن ترسیم میشود. در ادامه به توضیح اجمالی فایلی که نوشته شده میپردازیم.
version: '2'
نسخهی کامپوزفایل میباشد. دقت کنید که این نسخه اهمیت دارد و بر اساس آن ممکن است مواردی که در کامپوز فایل استفاده میکنید متفاوت باشد. مثلا یک آپشن در نسخهی ۲ کار میکنه اما در نسخهی ۳ یا اصلا کار نمیکند و یا به صورت دیگهای استفاده میشود.
services:
تمام سرویسها زیر مجموعهی آن قرار داده میشود. در مثال ما دو سرویس wordpress و database زیرمجموعهی سرویس قرار داده شده است.
db: نام سرویس است
image: mysql:5.7 سرویس با استفاده از چه ایمیجی راهاندازی میشود
restart: always سیاست ریستارت مربوط به کانتینر را مشخص میکند
environment: برای این سرویس متغیرهای محلی تعریف میکند
MYSQL_ROOT_PASSWORD: salamdonya
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: salamdonya
volumes: والیوم این کانتینر را مشخص میکند
- db:/var/lib/mysql
همانطور که میدونید شما از دو طریق میتونید والیوم رو استفاده کنید که اینجا قبلا توضیح دادیم. در این مثال تمام دیتای سرویس دیتابیس از طریق والیوم که با استفاده از دستور docker volume ساخته میشود از کانتینر به بیرون منتقل میشود.
volumes:
db:
این قسمت هم مربوط به ایجاد والیوم میباشد.
depends_on:
- db
این کانفیگ به شما این امکان را میدهد تا زمانی که کانتینر db راهاندازی نشده است کانتینر وردپرس راهاندازی نشود. مابقی موارد مربوط به وردپرس هم همانند دیتابیس میباشد که دیگه لازم نیست آنها رو هم توضیح بدیم.
چند تا نکتهی کوچک:
- متغیرهای محلی یا environment variable بسته به هر سرویس متفاوت میباشد و برخی از سرویسها همانند mysql متغیر محلیهای اجباری دارند که میبایست حتما تنظیم شوند. اگر این اتفاق نیافتد کانتینر به کار خودش ادامه نمیدهد و متوقف میشود.
- گاهی میتوان با استفاده از متغیرهای محلی برخی از کانفیگها همانند ایجاد دیتابیس در سرویس mysql را انجام داد و از این رو کار را پیش برد. دقت کنید که روش صحیح هم استفاده از این موارد است.
- دقت کنید آپشن depends_on تنها تا زمان راهاندازی کانتینر صبر میکند و اصلا شهود و شعوری ندارد که تا زمان راهاندازی سرویس داخل کانتینر صبر کند. از این رو اگر در این زمینه نیاز داشتید باید از اسکریپت استفاده کنید که بتواند تشخیص دهد تا سرویس راهاندازی نشده صبر کند.
مرحلهی ششم: پیادهسازی سناریو
بعد از اتمام مراحل بالاتر حالا با تمرکز بیشتر دو تا سرویس کامل راهاندازی میکنیم که بسیار پر کاربر هم میباشد.
سناریوی مربوط به مخزن خصوصی داکر:
سرویس اول سرویس داکر رجیستری است که به صورت خصوصی بتوانیم رجیستری خودمون رو داشته باشیم که تمام موارد راهاندازی آن را در اینجا میتونید پیدا کنید.
مرحلهی اول: به صورت خلاصه اگر بخوام بگم ابتدا فایلهای مربوط به nginx و رو آماده میکنیم.
mkdir -p auth data
مرحلهی دوم: کانفیگ مربوط به nginx را آماده میکنیم. این فایل را از اینجا میتوانید دانلود کنید.
مرحلهی سوم: با استفاده از دستور داکر فایل یورز و پسورد برای لاگین داخل مخزن را ایجاد میکنیم.
docker run --rm --entrypoint htpasswd registry:2 -Bbn USER PASSWORD > auth/nginx.htpasswd
مرحلهی چهارم: با استفاده از certbot برای دامنهی خودمون certificate میگیریم.
نصب certbot:
#centos:
yum install certbot
#ubuntu:
apt install certbot
ایجاد certificate:
certbot certonly --standalone --agree-tos -d SUB.DOMAIN.TLD
انتقال فایلهای certificate به محل مورد نظر برای استفادهی nginx:
cp /etc/letsencrypt/archive/SUB.DOMAIN.TLD/fullchain1.pem auth/fullchain.pem
cp /etc/letsencrypt/archive/SUB.DOMAIN.TLD/privkey1.pem auth/privkey.pem
مرحلهی پنجم: کامپوزفایل مورد نظر را ایجاد میکنیم. که از این آدرس میتوانید آن را بگیرید.
مرحلهی ششم: با استفاده از دستورات داکر کامپوز کامپوز فایل ایجاد شده را بررسی میکنیم.
docker-compose config
مرحلهی هفتم: با استفاده از دستورات داکر کامپوز سرویس خود را راهاندازی میکنیم.
docker-compose up -d
مرحلهی هشتم: با استفاده از دستورات داکر کامپوز سرویس خود را بررسی و تست میکنیم.
docker-compose ps
docker-compose logs -f --tail 10
این پست در حال کامل شدن است.
مطلبی دیگر از این انتشارات
آموزش نصب راحت داکر بر روی سیستمعامل لینوکس
مطلبی دیگر از این انتشارات
توضیح دستورات داکر – این قسمت docker push, start, stop, version, pause, top
مطلبی دیگر از این انتشارات
مشارکت در برنامهریزی سالانهی داکرمی برای سال ۹۹