داکر اپلیکیشنی است که فرایند مدیریت فرایندهای اپلیکیشن را در کانتینرها (Container) آسان میکند. کانتینرها این امکان را برای شما فراهم میکنند که منابع مورد نیاز برای اپلیکیشنهای خود را از داخل داکر تامین و آنها را اجرا کنید. کانتینرها را میتوان به ماشینهای مجازی تشبیه کرد؛ با این تفاوت که کانتینرها قابلحملتر هستند و وابستگی بیشتری به سیستم عامل میزبان دارند. در این مقاله قصد داریم نحوه نصب داکر روی اوبونتو را آموزش دهیم. با خواندن ادامه مطلب بهراحتی میتوانید داکر را نصب کرده و با کانتینرها و تصاویر کار کنید.
پیشنیازهای نصب داکر روی اوبونتو 22.04
برای نصب داکر در اوبونتو با روش مطرح در این مقاله به موارد زیر نیاز دارید:
- یک سرور اوبونتو 22.04 تنظیمشده با یک کاربر غیرریشه سودو (Sudo non-root user) و یک فایروال
- یک حساب کاربری در Docker Hub
چنانچه قصد استفاده از داکر را دارید ولی سرور اوبونتو در اختیار ندارید، وارد صفحه خرید سرور ابری شوید و بعد از تکمیل خرید و راهاندازی سرورتان گامهای مطرح در ادامه مقاله را طی کنید.
گام اول: نصب داکر
پکیج نصب داکر موجود در مخزن (Repository) رسمی اوبونتو ممکن است آخرین نسخه نباشد. به همین خاطر برای اطمینان از دریافت آخرین نسخه، بهتر است آن را از مخزن رسمی Docker نصب کنیم. برای انجام این کار یک منبع پکیج جدید و کلید GPG را از داکر اضافه میکنیم تا از معتبر بودن دانلودها مطمئن شویم و سپس پکیج را نصب میکنیم.
ابتدا با دستور زیر لیست پکیجهای موجود خود را بهروز کنید:
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 gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
با دستور زیر مخزن داکر را به منابع APT اضافه کنید:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
لیست پکیجهای موجود خود را برای شناسایی موارد اضافهتر دوباره بهروزرسانی کنید:
sudo apt update
برای اطمینان از اینکه در حال دانلود پکیج نصب از مخزن داکر هستید، نه مخزن پیشفرض اوبونتو، دستور زیر را اجرا کنید:
apt-cache policy docker-ce
با اجرای دستور بالا، نتیجهای مشابه زیر به شما نمایش داده خواهد شد؛ البته ممکن است عدد ورژن برای Docker متفاوت باشد:
docker-ce:
Installed: (none)
Candidate: 5:20.10.14~3-0~ubuntu-jammy
Version table:
5:20.10.14~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
5:20.10.13~3-0~ubuntu-jammy 500
500 https://download.docker.com/linux/ubuntu jammy/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 Fri 2022-04-01 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 7854 (dockerd)
Tasks: 7
Memory: 38.3M
CPU: 340ms
CGroup: /system.slice/docker.service
└─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
اگر اطلاعات کافی درباره نحوه استفاده از سرور ابری را ندارید، توصیه میکنیم قبل از ادامه مطلب، حتما درباره سرور ابری بیشتر بخوانید.
گام دوم: اجرای دستور داکر بدون Sudo (گام اختیاری)
دستور docker بهطور پیشفرض فقط میتواند توسط کاربر ریشه (Root) یا کاربری در گروه داکر اجرا شود که بهطور خودکار در طول فرایند نصب Docker ایجاد میشود. اگر شما قصد اجرای دستور docker بدون پیشوند با sudo یا بدون قرار گرفتن در گروه داکر را دارید، خروجی مانند زیر دریافت خواهید کرد:
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 را بهعنوان یک کاربر در گروه docker اجرا میکنید. در غیر این صورت لطفا دستورات را با sudo بنویسید. در ادامه دستور docker را مورد بررسی قرار میدهیم. اگر هنوز اطلاعات کافی درباره داکر ندارید، بهتر است ابتدا درباره داکر بیشتر بدانید تا بتوانید استفاده بهتر و مفیدتری از این پلتفرم منبعباز داشته باشید.
گام سوم: استفاده از دستور Docker
استفاده از دستور docker شامل زنجیرهای از گزینهها (Options)، دستورات (Commands) و در انتها آرگومانها (Arguments) است که باید به شکل زیر باشد:
docker [option] [command] [arguments]
برای مشاهده همه زیردستورها (Subcommands) عبارت زیر را تایپ کنید:
docker
لیست کامل زیردستورهای موجود در داکر نسخه 20.10.14 شامل موارد زیر میشود:
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
برای مشاهده اطلاعات کل سیستم (System-wide) درباره Docker از عبارت زیر استفاده کنید:
docker info
در ادامه مطلب بعضی از این دستورات را با یکدیگر بررسی خواهیم کرد.
گام چهارم: کار با Docker Images
کانتینرهای داکر از Docker Images ساخته شدهاند. Docker Image فایلی است که برای اجرای کد در کانتینر داکر استفاده میشود و بهعنوان مجموعهای از دستورالعملها برای ساخت کانتینرهای داکر عمل میکند. بهطور پیشفرض، داکر این Images را از Docker Hub پول (Pull) میکند؛ داکر هاب یک رجیستری Docker است که توسط کمپانی Docker مدیریت میشود. هرکسی میتواند Docker Images خود را در Docker Hub میزبانی کند؛ بنابراین اکثر اپلکیشینها و توزیعهای لینوکس که به آن نیاز دارید، Images را آنجا میزبانی میکنند.
با تایپ عبارت زیر میتوانید بررسی کنید که آیا به Images از Docker Hub دسترسی دارید و آنها را میتوانید دانلود کنید یا خیر:
docker run hello-world
خروجی زیر نشان میدهد که Docker بهخوبی کار میکند:
Output
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
…
داکر در ابتدا توانایی یافتن hello-world image را بهصورت محلی ندارد؛ بنابراین Image را از Docker Hub (مخزن پیشفرض) دانلود میکند. بعد از دانلود Image، داکر یک کانتینر از Image و اپلیکیشنی که درون آن اجرا میشود، ایجاد کرده و پیام را نمایش میدهد.
با استفاده از دستور docker همراه با جستوجوی زیردستور (Subcommand) میتوانید برای Images موجود در داکر هاب جستوجو کنید. بهعنوان مثال، برای جستوجوی Image اوبونتو عبارت زیر را تایپ کنید:
docker search ubuntu
این اسکریپت در Docker Hub خزش (Crawl) میکند و فهرستی از همه Imageهایی که نام آنها با رشته جستوجو مطابقت دارد را برمیگرداند. در این حالت، یک خروجی مشابه زیر دریافت خواهید کرد:
Output
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14048 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 283 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 88 [OK]
open-liberty Open Liberty multi-architecture images based… 51 [OK]
...
کلمه OK در ستون OFFICIAL نشان میدهد که Image توسط شرکت سازنده پروژه داکر ساخته و پشتیبانی میشود. هنگامی که Image مورد نظرتان را شناسایی کردید، شما میتوانید آن را با استفاده از زیردستور pull در کامپیوتر خود دانلود کنید. دستور زیر را برای دانلود Image رسمی ubuntu در کامپیوتر خود اجرا کنید:
docker pull ubuntu
با این کار خروجی زیر را مشاهده خواهید کرد:
Output
Using default tag: latest
latest: Pulling from library/ubuntu
e0b25ef51634: Pull complete
Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
بعد از دانلود Image، میتوانید با استفاده از Image دانلودشده با زیردستور run کانتینر را اجرا کنید. همانطور که در مثال hello-world مشاهده میکنید، اگر هنگام اجرای docker با زیردستور run، هیچ Image دانلود نشده باشد، کلاینت داکر ابتدا Image را دانلود کرده و سپس با استفاده از آن یک کانتینر را اجرا میکند.
برای دیدن Imageهایی که در کامپیوترتان دانلود کردهاید، عبارت زیر را تایپ کنید:
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
همانطور که در ادامه این مقاله خواهید دید، Imageهایی که برای اجرای کانتینرها استفاده میکنید قابل تغییر هستند و میتوانند برای تولید Images جدید استفاده شوند. در گام بعدی نحوه اجرای کانتینرها را با جزئیات بیشتری بررسی خواهیم کرد:
گام پنجم: اجرای یک کانتینر Docker
کانتینر hello-world که در مرحله قبل اجرا کردیم، نمونهای از کانتینری است که بعد از ارسال یک پیام آزمایشی اجرا و خارج میشود. کانتینرها میتوانند مفیدتر و تعاملی باشند. بهعنوان مثال، اجازه بدهید که یک کانتینر را با استفاده از آخرین Image اوبونتو اجرا کنیم. ترکیب سوئیچهای i- و t- به شما امکان دسترسی تعاملی shell را در کانتینر میدهد:
docker run -it ubuntu
خط فرمان شما باید تغییر کند تا این واقعیت منعکس شود که اکنون در حال کار داخل کانتینر هستید و خروجی باید به شکل زیر باشد:
Output
root@d9b100f2f636:/#
به شناسه کانتینر در خط فرمان توجه کنید که در این مثال d9b100f2f636 است. برای حذف آن شما به ID کانتینر برای شناسایی نیاز دارید. اکنون میتوانید هر دستوری را داخل کانتینر اجرا کنید. بهعنوان مثال، اجازه بدهید دیتابیس پکیج داخل کانتینر را بهروزرسانی کنیم. شما به پیشوند (Prefix) هیچ دستوری با sudo نیاز ندارید؛ زیرا بهعنوان کاربر روت داخل کانتینر عمل میکنید:
root@d9b100f2f636:/# apt update
سپس هر برنامهای را میتوانید در آن نصب کنید. بهعنوان مثال، با دستور زیر میتوانید Node.js را نصب کنید:
root@d9b100f2f636:/# apt install nodejs
با این کار Node.js از مخزن رسمی اوبونتو در کانتینر نصب خواهد شد. بعد از اتمام نصب، تایید کنید که Node.js نصب شده است:
root@d9b100f2f636:/# node -v
در نتیجه شماره نسخه در ترمینال شما نمایش داده خواهد شد:
Output
v12.22.9
هر تغییری که در کانتینر ایجاد میکنید، فقط برای همان کانتینر اعمال خواهد شد. برای خروج از کانتینر دستور exit را تایپ کنید. در گام بعدی نصب داکر در اوبونتو، به مدیریت کانتینرها در سیستم نگاهی خواهیم انداخت.
گام ششم: مدیریت کانتینرهای داکر
بعد از اینکه مدتی از داکر استفاده کردید، کانتینرهای فعال (در حال اجرا) و غیرفعال متعددی در کامپیوتر خود خواهید داشت. برای مشاهده کانتینرهای فعال از دستور زیر استفاده کنید:
docker ps
بهاینترتیب خروجی مشابه زیر مشاهده خواهید کرد:
Output
CONTAINER ID IMAGE COMMAND CREATED
در آموزش نصب داکر روی اوبونتو شما دو کانتینر را راهاندازی کردید؛ یکی از hello-world Image و دیگری از Ubuntu Image. این کانتینرها هرچند در سیستم شما وجود دارند، اما دیگر در حال اجرا نیستند. برای مشاهده همه کانتینرهای فعال و غیرفعال docker ps را با سوئیچ a- اجرا کنید:
docker ps -a
نتیجه را به شکل زیر مشاهده خواهید کرد:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" About a minute ago Exited (0) 7 seconds ago dazzling_taussig
587000e49d53 hello-world "/hello" 5 minutes ago Exited (0) 5 minutes ago adoring_kowalevski
برای مشاهده آخرین کانتینر ایجادشده سوئیچ l- را اجرا کنید:
docker ps -l
خروجی این دستور زیر به شکل زیر نمایش داده خواهد شد:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 3 minutes ago Exited (0) 2 minutes ago dazzling_taussig
برای راهاندازی یک کانتینر متوقفشده، از docker start استفاده کنید و در ادامه ID کانتینر یا نام کانتینر را بنویسید. بهعنوان مثال:
docker start 1c08a7a0d0e4
کانتینر مورد نظر شروع به کار خواهد کرد و شما میتوانید با docker ps وضعیت آن را به شکل زیر ببینید:
Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c08a7a0d0e4 ubuntu "bash" 6 minutes ago Up 8 seconds dazzling_taussig
برای متوقف کردن کانتینر نیز میتوانید از docker stop به همراه ID یا نام کانتینر استفاده کنید. در وضعیت کانتینر نام آن (dazzling_taussig) را مشاهده کردیم که برای متوقف کردن آن باید عبارت زیر را تایپ کنید:
docker stop dazzling_taussig
اگر دیگر قصد استفاده از یک کانتینر را ندارید، با استفاده از دستور docker rm آن را حذف کنید. برای حذف کامل یک کانتینر بعد از این دستور باید نام یا ID کانتینر را بنویسید. از دستور docker ps -a نیز برای پیدا کردن نام یا ID کانتینر مربوط به hello-world Image یا حذف آن استفاده کنید.
docker rm adoring_kowalevski
برای راهاندازی یک کانتینر جدید و اختصاص نام به آن از سوئیچ name– (دو عدد دش) استفاده کنید. همچنین سوئیچ rm– (دو عدد دش) برای ایجاد کانتینری به کار میرود که بعد از توقف، خود را حذف میکند. برای کسب اطلاعات بیشتر درباره انواع گزینهها (options) از دستور docker run help کمک بگیرید.
گام هفتم: ایجاد تغییرات در یک کانتینر و تبدیل آن به Image
در گام بعدی نصب داکر روی ubuntu قرار است به آموزش ایجاد تغییرات در Docker images بپردازیم. بعد از راهاندازی یک Docker image میتوانید دقیقا مانند یک ماشین مجازی آن را ایجاد، ویرایش و حذف کنید. تغییرات ایجادشده فقط روی همان کانتینر اعمال خواهد شد. شما میتوانید آن را شروع و متوقف کنید، اما با استفاده از دستور docker rm تغییرات بهطور کلی از بین خواهد رفت.
در این گام به شما آموزش میدهیم که چگونه وضعیت یک کانتینر را بهعنوان یک Docker image جدید ذخیره کنید. بعد از نصب Node.js داخل کانتینر اوبونتو، شما حالا یک کانتینر در حال اجرای یک Image دارید؛ اما کانتینر از Image که شما برای ایجاد آن استفاده کردهاید، متفاوت است. بااینحال ممکن است بخواهید از کانتینر Node.js بهعنوان مبنایی برای Imageهای جدید مجدد استفاده کنید.
با استفاده از دستور زیر تغییرات را روی یک Docker image جدید انجام دهید:
docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name
سوئیچ m- برای پیغام Commit است که به شما و دیگران کمک میکند تا بدانید چه تغییراتی ایجاد کردهاید، درحالیکه a- برای مشخص کردن نویسنده (author) استفاده میشود. Container_id همان شناسهای است که در گامهای قبلی نیز به آن اشاره شد. Repository یا مخزن معمولا همان نام کاربری Docker Hub است، مگر اینکه مخزنهای دیگری روی داکر هاب ایجاد کرده باشید.
بهعنوان مثال، برای کاربر sammy با ID کانتینر d9b100f2f636 دستور به شکل زیر خواهد بود:
docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs
وقتی که شما یک Image را commit میکنید، Image جدید بهصورت محلی در کامپیوترتان ذخیره میشود. در ادامه آموزش نصب داکر روی اوبونتو 22.04 خواهید آموخت که چگونه یک Image را میتوان در یک رجیستری داکر مانند Docker Hub پوش (Push) کرد تا دیگران هم به آن دسترسی داشته باشند.
با فهرست کردن مجدد Docker Images، هم Image جدید و هم Image قبلی آن نشان داده خواهد شد:
docker images
خروجی دستور بالا به شکل زیر نمایش داده میشود:
Output
REPOSITORY TAG IMAGE ID CREATED SIZE
sammy/ubuntu-nodejs latest 7c1f35226ca6 7 seconds ago 179MB
…
در مثال بالا، ubuntu-nodejs یک Image جدید است که از ubuntu image موجود در داکر هاب گرفته شده است. تفاوت اندازه، تغییراتی که به وجود آمده است را نشان میدهد. در این مثال، تغییر اعمالشده نصب NodeJS بود. بنابراین سری بعدی که به اجرای کانتینر با استفاده از ubuntu با NodeJS از پیش نصب شده نیاز داشتید، شما میتوانید از Imageجدید استفاده کنید.
همچنین میتوانید Imageهایی از یک Dockerfile بسازید که به شما اجازه نصب نرمافزار در یک Image جدید بهصورت خودکار را میدهد. بااینحال این آموزش از حوصله این بلاگ خارج است.
گام هشتم: Push (ارسال) Docker Image به مخزن داکر
بعد از ایجاد یک Image حتما میخواهید آن را با بعضی از دوستان خود یا کل افراد در داکر هاب یا سایر رجیستریهای داکر که به آنها دسترسی دارید، به اشتراک بگذارید. برای push کردن یک Image به داکر هاب یا هر رجیستری داکر دیگر باید یک حساب کاربری ایجاد کنید و سپس با دستور زیر وارد داکر هاب شوید:
docker login -u docker-registry-username
سپس از شما خواسته میشود تا با استفاده از رمز عبور داکر هاب خود به احراز هویت بپردازید. اگر رمز عبورتان صحیح بود، احراز هویت با موفقیت انجام خواهد شد.
نکته: اگر نام کاربری رجیستری داکر شما با نام کاربری محلی مورد استفاده هنگام ایجاد Image متفاوت است، باید Image خود را با نام کاربری رجیستری خود تگ کنید. برای این کار از دستور زیر میتوانید استفاده کنید:
docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs
در ادامه با دستور زیر Image خود را پوش کنید:
docker push docker-registry-username/docker-image-name
برای پوش کردن ubuntu-nodejs image به مخزن sammy دستور به شکل زیر خواهد بود:
docker push sammy/ubuntu-nodejs
این فرایند ممکن است بهدلیل آپلود Images کمی طول بکشد، اما بعد از تکمیل، خروجی به شکل زیر خواهد بود:
Output
The push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
…
بعد از پوش شدن یک Image در یک رجیستری، Image باید مانند عکس زیر در داشبورد اکانت شما لیست شود:
اگر هنگام پوش کردن Image با خطای زیر مواجه شدید، احتمالا وارد سیستم نشدهاید:
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 وارد شوید و دوباره برای پوش کردن Image تلاش کنید.
حالا میتوانید از docker pull sammy/ubuntu-nodejs برای pull کردن Image به یک ماشین جدید و استفاده از آن برای اجرای یک کانتینر جدید استفاده کنید.
منبع: DigitalOcean