برای راه‌اندازی اوراکل ۱۹.۳ بر روی داکر ابتدا باید داکر را بر روی پلتفرم هاست خود نصب کنید. برای نصب داکر از وبسایت رسمی داکر شما نیاز به ساخت اکانت در داکر هاب دارید. بعد از ساخت اکانت و نصب Docker Desktop با کلیک بر روی اون داکر به سادگی اجرا میشه.

توجه کنید اگر ورژن سیستم‌عامل هاست شما جزو نسخه‌های update شده است از Docker Desktop استفاده کنید و اگر هنوز از نسخه‌های قدیمی استفاده می‌کنید باید از Docker Tollbox استفاده کنید. (فرق این ۲ نسخه در نوع زیرساخت مجازی‌ساز مورد استفاده داکر است.)

نکته: توجه کنید حتما از یه راهکار مطمئن برای عبور از تحریم استفاده کنید. پیشنهاد من استفاده از دی ان اس‌های شکن یا سرویس‌های VPN Maker است.

از منوی داکر می‌تونید به راحتی در مک او اس داکر رو کنترل کنید.

نکته: در داکر هر ماشین داکری برابر یک کانتینر است. پس شما هر تعداد ماشین دیتابیس داشته باشید به تعداد ماشینها کانیتنر دارید. (توجه کنید درون کانتینر سرویس شما قرار می‌گیرد.)

توی مرحله بعدی ما نیاز به کانتینر دیتابیس اوراکل داریم. برای این مرحله دو راهکار موجود هستش:

روش اول

به داکر هاب برید (https://hub.docker.com) و oracle database را جستجو کنید. اینجا شما کانتینر ۱۲.۱.۰.۲ رو می‌بینید. این ایمیج ۲ تا مشکل داره اول اینکه نسخه ۱۲.۱.۰.۲ هستش و مشکل دوم این که یک ایمیج سازگار کامل نیست. این به این معنی که اگه شما کانتینر رو حذف کنید دیتابیس هنوز بر روی سیستم در حال اجرا باقی میمونه. همچنین قابلیت unplug کردن با کانتینر و plug کردن به یک کانتینر دیگه رو نداره

روش دوم

به آدرس گیت‌هاب اوراکل برید. اینجا تمام داکرفایل‌های ایجاد شده برای محصولات توسعه داده شده آزاد Oracle sponsored open source projects و محصولات تجاری Oracle Commercial به صورت رسمی توسط اوراکل قرار داده شده.

برای استفاده از محصولات تججاری شما باید از وارد وب‌سایت oracle.com بشوید و یک اکانت رایگان برای خودتان ایجاد کنید. سپس محصول مورد نظر خود را با تایید لایسنس OTN برای پلتفرم لینوکس ۶۴ بیتی دانلود کنید. (توجه کنید شما داکر رو بر روی هر پلتفرمی هاست کنید (لینوکس، ویندوز،‌مک) در آخر معماری داکر به صورت لینوکسی است. داکر در حال حاضر در ویندوز از Hyper-V و در مک از xhyve برای اجرای یک توزیع لینوکسی سبک و داکری به عنوان هاست استفاده میکنه)

نکته: در Docker Tollbox از مجازی‌ساز Virtualbox به جای مجازی‌ساز درونی xhyve استفاده می‌گرد.

https://docs.docker.com/docker-for-mac/docker-toolbox

مراحل کار

مرحله اول

حال از وبسایت اوراکل دیتابیس نسخه ۱۹.۳ رو برای پلتفرم لینوکس از طریق لینک زیر دانلود میکنیم:

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

نکته خوب این روش اینه که شما می‌تونید کانتینر داکر رو unplug کنید و جای دیگه دوباره plug کنید. همچنین اگه کانتینر رو حذف کنید به طور کامل دیتابیس حذف میشه. 

مرحله دوم

به صفحه https://github.com/oracle/docker-images بروید و ریپازیتوری رو به صورت فایل zip دانلود کنید.

مرحله سوم

حالا شما باید ۲ فایل دانلود شده داشته باشید:

LINUX.X64_193000_db_home.zip

docker-images-master.zip

فایل docker-images-master.zip رو از حالت فشرده خارج کنید خروجی دایکتوری به نام docker-images-master خواهد بود. در این دایرکتوری شما دایرکتوری‌های دیگه‌ای رو می‌بینید که هر کدوم یکی از محصولات اوراکل است که بر روی داکر پشتیبانی شده است.

با ترمینال مک می‌تونید با دستور زیر اقداک به unzip کنید و یا از نرم‌افزارهای گرافیکی استفاده کنید:

unzip docker-images-master.zip

مرحله چهارم

در این مرحله باید فایل LINUX.X64_193000_db_home.zip رو به محل 19.3.0/docker-images-master/OracleDatabase/dockerfiles انتقال دهید. توجه کنید این فایل رو به صورت zip ببرید و از unzip کردن اون پرهیز کنید.

مرحله پنجم

در این مرحله باید با یک نرمینال (در ویندوز cmd یا powershell) به مسیر docker-images-master/OracleDatabase/dockerfiles بریم و با دستور زیر داکر ایمیج خودمون رو برای نسخه ۱۹.۳ ایجاد کنیم. داکر فایل اوراکل با دانلود oraclelinux:7-slim از اینترنت اقدام به ساخت این ایمیج میکنه دقت داشته باشید دسترسی به اینترنت آزاد حتما بر روی سیستم تنظیم شده باشه.

./buildDockerImage.sh -v 19.3.0 -e

لاگ ترمینال رو حتما دنبال کنید:

Mahdis-MacBook-Air:dockerfiles mghaffari$ ./buildDockerImage.sh -v 19.3.0 -e
Ignored MD5 sum, 'md5sum' command not available.
==========================
DOCKER info:
Client:
 Debug Mode: false
Server:
 Containers: 0
  Running: 0
  Paused: 0
  Stopped: 0
 Images: 5
 Server Version: 19.03.2
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.9.184-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.952GiB
 Name: docker-desktop
 ID: R5AH:6RL6:5USK:FXIY:VO2K:YUXN:N7ZG:OECM:Q6UQ:B6KU:HA56:DWFY
 Docker Root Dir: /var/lib/docker
 Debug Mode: true
  File Descriptors: 29
  Goroutines: 45
  System Time: 2019-09-22T15:26:46.83033533Z
  EventsListeners: 2
 HTTP Proxy: gateway.docker.internal:3128
 HTTPS Proxy: gateway.docker.internal:3129
 Registry: https://index.docker.io/v1/

 Labels:
 Experimental: true
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine

==========================
Building image 'oracle/database:19.3.0-ee' ...

نکته: اگه در محیطی بودید که ناچار به ست کردن https_proxy برای دسترسی به اینترنت در لینوکس بودید نگران نباشید اسکریپت اوراکل به خوبی از پراکسی  پشتیبانی میکنه.

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

  Oracle Database Docker Image for 'ee' version 19.3.0 is ready to be extended: 

    --> oracle/database:19.3.0-ee
  Build completed in 1183 seconds. 

مرحله ششم

برای چک کردن وضعیت ایمیج از دستور docker images استفاده می‌کنیم:

همونطور که می‌بینید oraclelinux و oracle database با موفقیت به لیست ایمیج‌ها اضافه شده‌اند.

مرحله هفت

برای ساخت دیتابیس ما اول نیاز داریم یک کانتینر از ایمیج ساخته شده بسازیم. من اینکار رو با دستور زیر انجام میدم. همچنین شما می‌تونید مسیر oradata رو به صورت دستی تنظیم میکنم که با پاک کردن کانیتنر دیتاهای دیتابیس شما پاک نشوند.

آپشن name برای مشخص کردن اسم کانتینر ما است.

آپشن v به ما امکان ماونت کردن یک مسیر از هاست در کانتینر را می‌دهد. (پس اگر کانتینر پاک شود این مسیر از هاست پاک نمی‌شود)

آپشن p برای پابلیش کردن یک پورت از کانتینر به هاست است.

با دستور docker run --help می‌توانید توضیحات هر کدوم از آپشن‌ها را ببینید.

بدون ماونت کردن oradata در هاست:

docker run --name oracle -p 1521:1521 -p 5500:5500 oracle/database:19.3.0-ee

با ماونت کردن oradata در هاست:

docker run --name oracle -p 1521:1521 -p 5500:5500 -v /Users/mghaffari/oradata:/opt/oracle/oradata oracle/database:19.3.0-ee

به خروجی این دستور با دقت نگاه کنید. این خروجی برای DBAهای اوراکل بسیار آشنا است. توجه کنید خط اول پسورد کاربران SYS, SYSTEM و PDBADMIN نوشته شده است.

Mahdis-MacBook-Air:dockerfiles mghaffari$ docker run --name oracle -p 1521:1521 -p 5500:5500 oracle/database:19.3.0-ee

ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: x4tot7vE8Wo=1

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 22-SEP-2019 17:09:22
Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Starting /opt/oracle/product/19c/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 19.0.0.0.0 - Production
System parameter file is /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/55340f664d29/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                22-SEP-2019 17:09:23
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/55340f664d29/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
[WARNING] [DBT-11209] Current available memory is less than the required available memory (2,048MB) for creating the database.
   CAUSE: Following nodes do not have required available memory :
 Node:55340f664d29 Available memory:1.4918GB (1564240.0KB)
Prepare for db operation

8% complete
Copying database files
31% complete
Creating and starting Oracle instance
32% complete
36% complete

نکته: نام دیتابیس در این ایمیج ORCLCDB و دارای 1 pdb به نام ORCLPDB1 هستش حتما قبل از استفاده پارامترهای تنظیم شده را بازبینی کنید.

مرحله هشتم

دستور docker run ما در حقیقت ORACLE DBCA رو به صورت سایلنت اجرا میکنه و ساخت دیتابیس اوراکل رو انجام میده. چون ما در دستور پسورد کاربرها رو مشخص نکردیم به صورت پیش‌فرض یک پسورد تولید میشه و در اول خط خروجی نشان داده می‌شود برای تعویض پسورد از دستور docker exec برای اجرا اسکریپت تعویض پسورد ایمیج استفاده می‌کنیم:

docker exec oracle ./setPassword.sh Zz123456

مرحله نهم

با استفاده از دستور docker ps می‌توانیم وضعیت کانتینرهای در حال اجرا بر روی داکر را مشاهده کنیم:

docker ps -a

مرحله دهم

برای اتصال به کانینر از دستور زیر استفاده می‌کنیم:

docker exec -it oracle bash

و برای stop و start کردن کانتینر از دستورات زیر:

docker start oracle
 
docker stop oracle

لاگین با کاربر root

برای لاگین با کاربر root می‌توانید از دستور زیر اسفاده کنید:

docker exec -it -u root -w /root  oracle /bin/bash

مشاهده لاگ

با دستور زیر می‌توانید alert log اوراکل را از طریق داکر بخوانید:

docker logs oracle

پیدا کردن آی پی کانتینر

برای پیدا کردن آی پی کانیتنر از دستور زیر استفاده میکنیم:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' oracle

مک و Port Mapping

توجه کنید دسترسی مستقیم به آی‌پی های کانتینر در مک میسر نیست.

https://github.com/docker/for-mac/issues/2670

https://docs.docker.com/docker-for-mac/networking/#known-limitations-use-cases-and-workarounds

برای این منظور حتما باید port mapping انجام دهید.

تست اتصال از مک

در مک چون امکان دسترسی مستقیم به آی پی کانتینر نیست بعد از مپ کردن پورت به هاست می‌توانیم از طریق لوکال هاست ماشین به کانتینر دسترسی داشته باشیم:

خب ما توی ۱۰ مرحله بسیار ساده اوراکل را بر روی داکر راه‌اندازی کردیم اگه اطلاعات بیشتری درباره نحوه ساختن ایمیج سفارشی برای دیتابیس اوراکل نیاز دارید به لینک زیر مراجعه کنید:

https://geraldonit.com/2017/08/21/creating-an-oracle-database-docker-image