Docker پلتفرمی رایگان و متن بازی است که مدیریت فرآیندهای برنامه ازجمله ایجاد، پیاده سازی و اجرای برنامه ها را در کانتینرها ساده می کند.
کانتینرها به شما این امکان را می دهند که برنامه های خود را در محیط های جدا شده و به صورت مستقل اجرا کنید.
آنها شبیه به ماشینهای مجازی هستند، اما کانتینرها انعطاف پذیرتر و بیشتر وابسته به سیستم عامل میزبان هستند.
در این آموزش، Docker Community Edition (CE) را در اوبونتو 20.04 نصب و استفاده خواهید کرد.
شما خود Docker را نصب میکنید، با کانتینرها و ایمیج ها کار میکنید و یک ایمیج را در یک مخزن Docker قرار میدهید.
پیش نیازهاي نصب Docker
برای دنبال کردن این آموزش به موارد زیر نیاز دارید:
- یک سرور دارای سیستم عامل اوبونتو 20.04 که با پیروی از مقاله تنظیمات اولیه سرور اوبونتو 20.04تنظیمات اولیه سرور Ubuntu 20.04 پیکربندی شده باشد.
- یک کاربر غیر از روت به همراه دسترسی sudo و یک فایروال راه اندازی شده
- برای مراحل 7 و 8 نیاز خواهید داشت در Docker Hub یک حساب کاربری داشته باشید.
بسته نصبی Docker موجود در مخزن رسمی اوبونتو ممکن است آخرین نسخه نباشد.
برای اطمینان از دریافت آخرین نسخه آن، Docker را از مخزن رسمی Docker نصب می کنیم.
برای انجام این کار، یک منبع جدید اضافه می کنیم، کلید GPG را از Docker اضافه می کنیم تا مطمئن شویم دانلودها معتبر هستند و سپس بسته را نصب می کنیم.
ابتدا لیست بسته های موجود خود را به روز کنید:
sudo apt update
در مرحله بعد، باید چند بسته پیش نیاز را نصب کنید، که apt امکان استفاده از بسته ها را از طریق پروتکل HTTPS برای شما فراهم می کند:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
سپس کلید GPG مخزن رسمی Docker را به سیستم خود اضافه کنید:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
مخزن Docker را به منابع APT اضافه کنید:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
این دستور همچنین پایگاه داده بسته های ما را با بسته های Docker از مخزن جدید اضافه شده به روز می کند.
مطمئن شوید که در حال نصب از مخزن Docker به جای مخزن پیشفرض اوبونتو هستید:
apt-cache policy docker-ce
خروجی مانند زیر خواهید دید، اگرچه شماره نسخه Docker ممکن است برای شما متفاوت باشد:
docker-ce: Installed: (none) Candidate: 5:19.03.9~3-0~ubuntu-focal Version table: 5:19.03.9~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
توجه داشته باشید که ابزار docker-ce نصب نشده است، حال باید آن را نصب کنیم:
sudo apt install docker-ce
اکنون باید داکر نصب شود، Docker Daemon شروع به کار کند، با دستور زیر وضعیت آن را چک کنید:
sudo systemctl status docker
خروجی باید مشابه موارد زیر باشد و نشان دهد که سرویس فعال و در حال اجرا است:
Output ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 24321 (dockerd) Tasks: 8 Memory: 46.4M CGroup: /system.slice/docker.service └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
اکنون با نصب داکر نه تنها سرویس داکر (Docker Daemon) بلکه ابزار خط فرمان Docker یا کلاینت داکر را نیز در اختیار شما قرار می دهد.
در ادامه این آموزش نحوه استفاده از دستور docker را بررسی خواهیم کرد.
مرحله 2 – اجرای دستور Docker
بهطور پیشفرض، این دستور داکر فقط میتواند توسط کاربر ریشه یا توسط کاربر دارای امیتازات مخصوص داکر اجرا شود که به طور خودکار در طول فرآیند نصب Docker ایجاد میشود.
اگر بخواهید دستور docker را بدون پیشوند sudo یا بدون قرار گرفتن در گروه docker اجرا کنید، خروجی مانند زیر دریافت خواهید کرد:
Output docker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?. See 'docker run --help'.
اگر می خواهید هر زمان که دستور docker را اجرا می کنید از تایپ کردن sudo خودداری کنید، نام کاربری خود را به گروه docker اضافه کنید:
sudo usermod -aG docker ${USER}
برای اعمال عضویت گروه جدید، از سرور خارج شده و دوباره وارد شوید، یا عبارت زیر را تایپ کنید:
su - ${USER}
برای ادامه، از شما خواسته می شود رمز عبور کاربر خود را وارد کنید.
با تایپ کردن دستور زیر ، بررسی کنید که کاربر شما اکنون به گروه docker اضافه شده است یا خیر :
groups
Output sammy sudo docker
اگر میخواهید کاربری را به گروه docker اضافه کنید که با آن وارد نشدهاید، آن نام کاربری را صریحاً با استفاده از دستور زیر وارد نمایید:
sudo usermod -aG docker username
در بقیه این مقاله فرض می کنیم که شما دستور داکر را به عنوان یک کاربر در گروه docker اجرا می کنید. اگر نمیخواهید، لطفاً دستورات را با پیشوند sudo وارد کنید.
اجازه دهید دستور بعدی داکر را بررسی کنیم.
مرحله 3 – استفاده از دستور Docker
نحوه استفاده از داکر برای ارسال زنجیره ای گزینه ها و دستورات به همراه یک سری از آرگومان هاست. مانند:
docker [option] [command] [arguments]
برای مشاهده تمام دستورات فرعی موجود، دستور زیر را تایپ کنید:
docker
لیست کاملی از دستورات فرعی موجود در Docker شامل موارد زیر است:
Output attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
برای مشاهده گزینه های موجود برای یک دستور خاص، تایپ کنید:
docker docker-subcommand --help
برای مشاهده اطلاعات کل سیستم در مورد Docker، از موارد زیر استفاده کنید:
docker info
بیایید برخی از این دستورات را بررسی کنیم. ما با کار با ایمیج ها شروع می کنیم.
مرحله 4 – کار با Docker Images
کانتینرهای داکر از ایمیج داکر ساخته شده اند.
بهطور پیشفرض، Docker این ایمیج ها را از Docker Hub، که توسط خود سازنده ایجاد شده است بر می دارد.
هرکسی میتواند ایمیج های Docker خود را در Docker Hub میزبانی کند، بنابراین اکثر برنامهها و توزیعهای لینوکسی که نیاز دارید، ایمیج شان را در آنجا میزبانی میکنند.
برای بررسی اینکه آیا می توانید به ایمیج ها از طریق Docker Hub دسترسی داشته باشید و آنها را بارگیری کنید، دستور زیر را تایپ کنید:
docker run hello-world
خروجی نشان می دهد که Docker به درستی کار می کند:
Output Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 0e03bdcc26d7: Pull complete Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...
داکر در ابتدا قادر به یافتن ایمیج hello-world به صورت محلی نبود، بنابراین این ایمیج را از داکر هاب، که مخزن پیش فرض است، دانلودمی کرد.
پس از بارگیری ایمیج ، داکر یک کانتینر از آن ایمیج ایجاد می کرد و برنامه را درون آن کانتینر اجرا می کرد و پیام را نمایش می داد.
در داکر با استفاده از فرمان search می توانید ایمیج های موجود در Docker Hub را جستجو کنید .
به عنوان مثال، برای ایمیج اوبونتو، این دستور را تایپ کنید:
docker search ubuntu
این اسکریپت Docker Hub را جستجو می کند و فهرستی از تمام ایمیج هایی که نام آنها با رشته جستجو شده مطابقت دارد را برمیگرداند.
در این حالت خروجی مشابه این خواهد بود:
Output NAME DESCRIPTION STARS OFFICIAL AUTOMATED ubuntu Ubuntu is a Debian-based Linux operating sys… 10908 [OK] dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 428 [OK] rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 244 [OK] consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 218 [OK] ubuntu-upstart Upstart is an event-based replacement for th… 108 [OK] ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ...
در ستون OFFICIAL اوکی ایمیج را نشان می دهد که توسط شرکت پشتیبان پروژه ساخته و پشتیبانی می شود.
هنگامی که ایمیجی را که می خواهید از آن استفاده کنید را شناسایی کردید، می توانید آن را با استفاده از دستور فرعی pull در رایانه خود دانلود کنید.
دستور زیر را برای دانلود ایمیج رسمی ubuntu در رایانه خود این دستور را اجرا کنید:
docker pull ubuntu
خروجی زیر را خواهید دید:
Output Using default tag: latest latest: Pulling from library/ubuntu d51af753c3d3: Pull complete fc878cd0a91c: Pull complete 6154df8ff988: Pull complete fee5db0ff82f: Pull complete Digest: sha256:747d2dbbaaee995098c9792d99bd333c6783ce56150d1b11e333bbceed5c54d7 Status: Downloaded newer image for ubuntu:latest docker.io/library/ubuntu:latest
پس از بارگیری یک ایمیج ، می توانید با استفاده از ایمیج دانلود شده با دستور فرعی run، یک کانتینر را اجرا کنید.
همانطور که در مثال hello-world مشاهده کردید، اگر ایمیجی هنگام اجرا docker با دستور فرعی run دانلود نشده باشد، کلاینت Docker ابتدا ایمیج را دانلود می کند، سپس یک کانتینر را با استفاده از آن اجرا می کند.
برای مشاهده ایمیجی که در رایانه شما دانلود شده اند، دستور زیر را تایپ کنید:
docker images
خروجی مشابه شکل زیر خواهد بود:
Output REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 1d622ef86b13 3 weeks ago 73.9MB hello-world latest bf756fb1ae65 4 months ago 13.3kB
همانطور که بعداً در این آموزش خواهید دید، ایمیجی که برای اجرای کانتینرها استفاده می کنید را می توان تغییر داد و برای تولید ایمیج جدید استفاده کرد که ممکن است سپس (که اصطلاح فنی است) در Docker Hub یا سایر ثبت های Docker آپلود شوند .
بیایید نحوه اجرای کانتینرها را با جزئیات بیشتر بررسی کنیم.
مرحله 5 – اجرای یک Docker Container
کانتینری که hello-world را در مرحله قبل در آن اجرا کردید نمونه ای از کانتینری است که پس از ارسال یک پیام آزمایشی اجرا می شود و از آن خارج می شود. کانتینرها می توانند بسیار مفیدتر از آن باشند و می توانند تعاملی باشند.
پس از همه، آنها شبیه به ماشین های مجازی هستند، فقط منابع در آن ها بهینه تر است.
به عنوان مثال، اجازه دهید یک کانتینر را با استفاده از آخرین ایمیج اوبونتو اجرا کنیم.
ترکیب سوئیچ های i- و t- به شما امکان دسترسی تعاملی پوسته به کانتینر را می دهد:
docker run -it ubuntu
خط فرمان شما باید تغییر کند تا این نکته را به شما منعکس کند که اکنون در داخل کانتینر کار می کنید و باید به این شکل باشد:
Output root@d9b100f2f636:/#
به شناسه کانتینر در خط فرمان توجه کنید.
در این مثال، آن d9b100f2f636 است . وقتی میخواهید از کانتینر استفاده کنید، به شناسه کانتینر نیاز دارید تا آن را شناسایی کنید.
اکنون می توانید هر دستوری را در داخل کانتینر اجرا کنید.
به عنوان مثال، بیایید پایگاه داده بسته را در داخل کانتینر به روز کنیم.
شما نیازی به پیشوند هیچ دستوری با sudo ندارید، زیرا به عنوان کاربر ریشه در داخل کانتینر کار می کنید:
apt update
سپس هر اپلیکیشنی را در آن نصب کنید. بیایید Node.js را نصب کنیم:
apt install nodejs
Node.js را از مخزن رسمی اوبونتو نصب می کند.
پس از اتمام نصب، با دستور زیر بررسی کنید که Node.js نصب شده باشد:
node -v
شماره نسخه را در ترمینال خود خواهید دید:
Output v10.19.0
هر تغییری که در داخل کانتینر ایجاد می کنید فقط برای همان کانتینر اعمال می شود.
برای خروج از کانتینر ،دستور exit تایپ کنید.
بیایید در ادامه به مدیریت کانتینرهای سیستم خود نگاه کنیم.
مرحله 6 – مدیریت کانتینرهای Docker
پس از مدتی استفاده از Docker، کانتینرهای فعال (در حال اجرا) و غیرفعال زیادی در رایانه خود خواهید داشت.
برای مشاهده موارد فعال ازدستور زیر استفاده کنید:
docker ps
خروجی مشابه زیر را خواهید دید:
Output CONTAINER ID IMAGE COMMAND CREATED
در این آموزش شما دو کانتینر را اجرا کردید.
یکی ایمیج hello-world و دیگری ایمیج ubuntu هر دو کانتینر دیگر در حال اجرا نیستند، اما همچنان در سیستم شما وجود دارند.
برای مشاهده همه کانتینرهای فعال و غیرفعال، از docker ps با سوئیچ a- اجرا کنید:
docker ps -a
خروجی مشابه این را خواهید دید:
1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 8 seconds ago quizzical_mcnulty
a707221a5f6c hello-world "/hello" 6 minutes ago Exited (0) 6 minutes ago youthful_curie
برای مشاهده آخرین کانتینری که ایجاد کرده اید، از سوئیچ l- استفاده کنید:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "/bin/bash" 2 minutes ago Exited (0) 40 seconds ago quizzical_mcnulty
برای راهاندازی یک کانتینر متوقف شده، از docker start و به دنبال آن از شناسه کانتینر یا نام کانتینر استفاده کنید.
اجازه دهید كانتينر مبتنی بر اوبونتو را با شناسه 1c08a7a0d0e4 شروع کنیم :
docker start 1c08a7a0d0e4
کانتینر شروع می شود و می توانیداز docker ps برای مشاهده وضعیت آن استفاده کنید:
output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1c08a7a0d0e4 ubuntu "/bin/bash" 3 minutes ago Up 5 seconds quizzical_mcnulty
برای متوقف کردن یک کانتینر در حال اجرا، از docker stop و به دنبال آن شناسه یا نام کانتینر استفاده کنید.
این بار از نامی که داکر به کانتینر اختصاص داده است استفاده خواهیم کرد که عبارت است از quizzical_mcnulty:
docker stop quizzical_mcnulty
هنگامی که تصمیم گرفتید دیگر نیازی به کانتینر ندارید، آن را با دستور docker rm حذف کنید و دوباره از شناسه کانتینر یا نام استفاده کنید.
از دستور docker ps -a برای یافتن شناسه یا نام کانتینر مرتبط با ايميج hello-world و حذف آن استفاده کنید.
docker rm youthful_curie
با استفاده از name– می توانید یک کانتینر جدید راه اندازی کنید و با استفاده از سوئیچ نامی برای آن بگذارید .
همچنین میتوانید از سوئیچ rm– برای ایجاد كانتينري استفاده کنید که پس از توقف، خود را حذف میکند.
برای اطلاعات بیشتر در مورد این گزینه ها و سایر گزینه ها به دستور docker run help مراجعه کنید .
کانتینرها را می توان به ايميج هايي تبدیل کرد که می توانید از آنها برای ساخت كانتينر جدید استفاده کنید. بیایید ببینیم که اين چگونه کار می کند.
مرحله 7 – انجام تغییرات در یک کانتینر در یک ايميج داکر
هنگامی که یک ايميج داكر را راه اندازی می کنید، می توانید مانند یک ماشین مجازی فایل ها را ایجاد، اصلاح و حذف کنید.
تغییراتی که ایجاد می کنید فقط برای آن كانتينر اعمال می شود.
می توانید آن را شروع و متوقف کنید، اما وقتی بادستور docker rm آن را از بین ببرید، تغییرات برای همیشه از بین می روند.
این بخش به شما نشان می دهد که چگونه وضعیت یک کانتینر را به عنوان یک ايميج داکر جدید ذخیره کنید.
پس از نصب Node.js در داخل کانتینر اوبونتو، اکنون یک کانتینر در حال اجرا از یک ايميج داريد، اما كانتينر يا ايميجي که برای ایجاد آن استفاده کرده اید متفاوت است.
اما ممکن است بخواهید بعداً از این کانتینر Node.js به عنوان مبنایی برای ايميج جدید استفاده کنید.
سپس با استفاده از دستور زیر تغییرات را در یک نمونه جدید از ايميج Docker ذخيره كنيد.
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
سوئیچ m– برای كامنت گذاري است که به شما و دیگران کمک می کند تا بدانید چه تغییراتی ایجاد کرده اید، در حالی که a- برای تعیین نویسنده استفاده می شود.
container_id همان چیزی است که قبلاً هنگام شروع مقاله Docker به آن اشاره کردید.
معمولاً نام کاربری Docker Hub شما repository است، مگر اینکه مخازن اضافی در Docker Hub ایجاد کرده باشید.
به عنوان مثال، برای کاربر sammy ، با شناسه کانتینر d9b100f2f636، دستور به صورت زیر خواهد بود:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
هنگامی که یک تصویر را ارسال می کنید، تصویر جدید به صورت محلی در رایانه شما ذخیره می شود.
بعداً در این آموزش، یاد خواهید گرفت که چگونه یک ايميج را در یک رجیستری Docker مانند Docker Hub قرار دهید تا دیگران هم بتوانند به آن دسترسی داشته باشند.
با فهرست کردن مجدد ايميج هاي داکر، ايميج جدید و همچنین ايميج قدیمی که از آن مشتق شده است نشان داده می شود:
docker images
خروجی را مانند این خواهید دید:
Output REPOSITORY TAG IMAGE ID CREATED SIZE sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB ...
در این مثال، ubuntu-nodejs ايميج جدید است که از ايميج ubuntu موجود از Docker Hub مشتق شده است.
تفاوت حجم آن ها نشان دهنده تغییرات ایجاد شده است.
و در این مثال تغییر این بود که NodeJS در آن كانيتنر نصب شده است.
بنابراین دفعه بعد که نیاز به اجرای یک کانتینر با استفاده از اوبونتو همراه با NodeJS از پیش نصب شده دارید، فقط می توانید از اين ايميج جدید استفاده کنید.
همچنین می توانید ايميج ها را از یک Dockerfile بسازیدکه به شما امکان می دهد نصب نرم افزار را در یک ايميج جدید را به طور خودکار انجام دهید.
با این حال، این خارج از محدوده این آموزش است.
حالا بیایید ايميج جدید را با دیگران به اشتراک بگذاریم تا ديگران هم بتوانند از اين كانتينر ها استفاده كنند.
مرحله 8 – انتقال ايميج داكر به مخزن Docker Hub
مرحله بعدی پس از ایجاد یک ايميج جدید از یک ايميج موجود این است که آن را با تعدادی از دوستان منتخب خود يا کل جهان در Docker Hub یا سایر رجیستری های Docker که به آنها دسترسی دارید به اشتراک بگذارید.
برای ارسال یک ايميج به Docker Hub یا هر رجیستری Docker دیگر، باید یک حساب كاربري در آنجا داشته باشید.
این بخش به شما نشان می دهد که چگونه یک ايميج Docker را در Docker Hub قرار دهید.
برای قرار دادن ايميج خود، ابتدا وارد داکر هاب شوید.
docker login -u docker-registry-username
از شما خواسته می شود با استفاده از رمز عبور Docker Hub خود را احراز هویت کنید.
اگر رمز عبور صحیح را واردکرده اید، احراز هویت باید با موفقیت انجام شود.
توجه: اگر نام کاربری شما در داكرهاب با نام کاربری محلی که برای ایجاد ايميج استفاده کرده اید متفاوت است، باید ايميج خود را با نام کاربری داكر هاب خود تگ کنید. برای اين مثال داده شده در مرحله آخر، باید دستور زير را تایپ کنید:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
سپس می توانید تصویر خود را با استفاده از دستور زير در داكر هاب قرار دهيد:
docker push docker-registry-username/docker-image-name
برای قراردادن ايميج ubuntu-nodejs به مخزن sammy، دستور به صورت زیر خواهد بود:
docker push sammy/ubuntu-nodejs
ممکن است اين فرآیند با آپلود ايميج مدتی طول بکشد، اما پس از تکمیل، خروجی به شکل زیر خواهد بود:
Output The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Pushed 5f70bf18a086: Pushed a3b5c80a4eba: Pushed 7f18b442972b: Pushed 3ce512daaf78: Pushed 7aae4540b42d: Pushed ...
پس از قرار دادن یک ايميج در یک حساب كاربري داكر هاب ، باید آن در داشبورد حساب شما ديده شود، مانند آنچه در تصویر زیر نشان داده شده است.
اگر تلاش براي قرار دادن ايميج منجر به این نوع خطا شود، احتمالاً وارد سیستم نشده اید:
Output The push refers to a repository [docker.io/sammy/ubuntu-nodejs] e3fbbfb44187: Preparing 5f70bf18a086: Preparing a3b5c80a4eba: Preparing 7f18b442972b: Preparing 3ce512daaf78: Preparing 7aae4540b42d: Waiting unauthorized: authentication required
وارد docker login شوید و تلاش براي قرار دادن ايميج را تکرار کنید. سپس بررسی کنید که در صفحه مخزن Docker Hub شما وجود دارد يا خير.
اکنون می توانیداز docker pull sammy/ubuntu-nodejs برای انتقال ايميج به یک دستگاه جدید و استفاده از آن برای اجرای یک كانتينر جدید استفاده کنید.
نتیجه
در این آموزش شما Docker را نصب کردید، با ايميج ها و کانتینرها نيز کار کردید و یک ايميج اصلاح شده را به Docker Hub منتقل کردید.