ویرگول
ورودثبت نام
فرهاد صادقی
فرهاد صادقیمهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
فرهاد صادقی
فرهاد صادقی
خواندن ۴ دقیقه·۱ ماه پیش

دستورات Docker و Dockerfile و Docker Compose

1. Docker Commands

get pulled images

$ docker images

pull image

$ docker pull busybox $ docker pull docker.elastic.co/elasticsearch/elasticsearch:6.3.2

remove all images

$ docker rmi

run container from an image

// name: container name // it: join to the container // rm: remove container after termination // d: run container in dettached process // P: show container’s all ports // p: set container port // p 8888:80 use port 8888 instead of 80 // net: bridge network name that container run on it ​ $ docker run busybox $ docker run busybox echo "hello from busybox" $ docker run -it busybox sh $ docker run --rm prakhar1989/static-site $ docker run -d -P --name static-site prakhar1989/static-site $ docker run -p 8888:80 prakhar1989/static-sit $ docker run -d --name es -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2 $ docker run -it --rm --net foodtrucks-net prakhar1989/foodtrucks-web bash $ docker container run -d --name myapp mytime-exporter:v1.0.0

get containers list

// none: get only running containers // a: get all containers // q: return only containers ID // f: set condition ​ $ docker ps $ docker ps -a $ docker ps -a -q -f status=exited $ docker ps -a | grep myapp ​ $ docker container ls

view container logs

$ docker container logs mycontainername ​ //view last 200 line of myapp container log $ docker container logs –tail 200 -f myapp

stop container

$ docker container stop containername $ docker stop containername

remove containers

$ docker rm 305297d7a235 ff0a5c3750b9 $ docker container rm containername $ docker container rm --force myapp ​ //remove all containers $ docker container prune

view a container’s all ports

$ docker port containername

​

get docker networks

$ docker network ls NETWORK ID NAME DRIVER SCOPE 5ae2ac433ebf bridge bridge local 65e87bdbf368 host host local ae51ba479b34 none null local

* شبکه bridge، شبکه‌ای است که در آن کانتینرها به صورت پیش‌فرض اجرا می‌شوند.

inspect a docker network

$ docker network inspect netowrkname

create bridge network

$ docker network create foodtrucks-net

remove network

$ docker network rm foodtrucks-net


2. Build and Run Automation

دستورات در یک اسکریپت Bash به صورت زیر گرد‌آوری می شوند:

# ساخت کانتینر فلسک docker build -t prakhar1989/foodtrucks-web . ​ # ایجاد شبکه docker network create foodtrucks-net ​ # راه•اندازی کانتینر ES docker run -d --name es --net foodtrucks-net -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:6.3.2 ​ # راه•اندازی کانتینر اپلیکیشن فلسک docker run -d --net foodtrucks-net -p 5000:5000 --name foodtrucks-web prakhar1989/foodtrucks-web

اکنون باید تصور کرد که قرار است اپلیکیشن مربوطه برای اشخاص دیگری توزیع یا این اپلیکیشن روی سروری اجرا شود که داکر در آن نصب شده است:

$ git clone https://github.com/prakhar1989/FoodTrucks $ cd FoodTrucks $ ./setup-docker.sh

و به این ترتیب کار به اتمام رسیده است. این یک روش بسیار عالی و قدرتمند برای به اشتراک گذاری و اجرای اپلیکیشن‌ها به حساب می‌آید.


3. Dockerfile

# شروع کار با ایمیج پایه FROM ubuntu:18.04 ​ # نصب متعلقات سراسری در سیستم برای پایتون و گره RUN apt-get -yqq update RUN apt-get -yqq install python3-pip python3-dev curl gnupg RUN curl -sL https://deb.nodesource.com/setup_10.x | bash RUN apt-get install -yq nodejs ​ # کپی کردن کدهای اپلیکیشن مربوطه ADD flask-app /opt/flask-app ​ # تنظیم یک شاخه برای اپلیکیشن WORKDIR /opt/flask-app ​ # دریافت متعلقات مختص اپلیکیشن RUN npm install RUN npm run build RUN pip3 install -r requirements.txt ​ # در معرض استفاده قرار دادن پورت EXPOSE 5000 ​ # راه•اندازی و استارت زدن اپلیکیشن CMD [ "python3", "./app.py" ]

پرچم «yqq» برای حذف خروجی استفاده می‌شود و همه اعلان‌ها (Prompt) را «Yes» در نظر می‌گیرد.

create image from dockerfile

$ docker build . -t yourusername/imagename $ docker image build . -t mytime-exporter:v1.0.0

publish created image

$ docker push yourusername/imagename

save created image

docker image save mytime-exporter:v1.0.0 > mytime.tar

import saved image to containerd

ctr -n k8s.io images import mytime.tar

4. Docker Compose

Compose ابزاری است که برای تعریف و اجرای اپلیکیشن‌های چند کانتینری به شکلی ساده مورد استفاده قرار می‌گیرد. این ابزار یک فایل پیکربندی به نام «docker-compose.yml» فراهم می‌کند که می‌توان از آن تنها با یک دستور برای استقرار یک اپلیکیشن و مجموعه سرویس‌هایش استفاده کرد که به آن‌ها وابسته است. Compose در تمام محیط‌ها کار می‌کند. هر یک از این محیط‌ها در ادامه فهرست شده‌اند:

  • تولید (Production)

  • صحنه پردازی (Staging)

  • توسعه (Development)

  • آزمایش (Testing)

  • به همراه جریان‌های کاری CI

اگرچه، باید گفته شود که Compose بیش‌تر برای محیط‌های توسعه و تست ایده‌آل است.

محتویات فایل Docker Compose به صورت زیر است:

version: "3" services: es:   image: docker.elastic.co/elasticsearch/elasticsearch:6.3.2   container_name: es   environment:     - discovery.type=single-node   ports:     - 9200:9200   volumes:     - esdata1:/usr/share/elasticsearch/data web:   image: prakhar1989/foodtrucks-web   build: . # replaced image with build   command: python3 app.py   depends_on:     - es   ports:     - 5000:5000   environment:     - DEBUG=True # set an env var for flask   volumes:     - ./flask-app:/opt/flask-app volumes: esdata1:   driver: local

*Volumeها دایرکتوری‌های به اشتراک گذاشته شده بین کانتینرها هستند.

check docker version

$ docker-compose –version

create and run docker container from docker compose

$ docker-compose up ​ //run docker-compose container detached $ docker-compose up -d

get containers list

$ docker-compose ps

delete compose and its data

$ docker-compose down -v

وقتی دستور up اجرا می شود؛ Compose خودش یک شبکه جدید به نام «composename_default» ایجاد و سرویس های جدید را در آن شبکه به گونه‌ای ضمیمه می کند که هر یک از آن‌ها برای دیگری قابل شناسایی باشند. هر کانتینر برای یک سرویس به شبکه پیش‌فرض می‌پیوندد و هر یک به وسیله سایر کانتینرها در آن شبکه قابل دسترسی و توسط آن‌ها با نام میزبانی مطابق نام کانتینر قابل شناسایی هستند.

​

docker composedockerdockerfileداکرفایلداکر
۴
۰
فرهاد صادقی
فرهاد صادقی
مهندس نرم افزار، طراحی و راه اندازی سیستم های نرم افزاری بر پایه معماری میکروسرویس
شاید از این پست‌ها خوشتان بیاید