Docker - How to run Sybase ASE in a container
This page will show you how SAP Sybase ASE (version 16.0 GA PL01) can be run in a docker container. You will also see how to work with docker images, containters and volumes.
All tests have been carried out on a Linux Centos 7 environment, I expect little to no change if you need to run it on Redhat. You need about 10 Gb of free space to install the Sybase software, database devices, etc. Beware that you need to split this free space into several separately mounted filesystems.
The Sybase ASE server will be called "ASE1".
No performance optimization has been done for docker nor for Sybase.
Unless otherwise noted, all commands need to be run under "root".
Contents
- 1 Prepare the system
- 2 Initial docker setup
- 3 Create 2 docker images customized for Sybase
- 4 Setup storage
- 5 Create the docker container for the database files
- 6 Create the container for the Sybase software
- 7 Create the container to run Sybase ASE
- 8 Build the Sybase ASE server
- 9 Create a new container that will kick off ASE1 when the container starts
- 10 Build the Sybase backup server
- 11 How to manage the Sybase instances
- 12 Wrapping up
Prepare the system
Prepare your system to run docker and create the sybase user.
Package update
Under Centos / Redhat 7 firewalld can conflict with docker so we will remove it from the system.
yum remove firewalld
Make sure you have the latest patches installed. Reboot if a new kernel has been downloaded.
yum update reboot
Add sybase user and group
Docker data volumes are separate filesystems on the Linux and are made available in a docker container. The sybase processes running in these containers must have the same uid/guid for the sybase user as on the host system (your Centos / Redhat server). Keep the uid/gid for the sybase user everywhere the same.
groupadd sybase -g <free-number> useradd -u <free-number> -g sybase sybase
Initial docker setup
Install docker, start it, and have it started when the Linux server boots.
yum install docker systemctl start docker systemctl enable docker
If you run "docker images" you can see the available images. Download a basic docker image for centos.
docker images docker pull centos docker images
Create 2 docker images customized for Sybase
We will create 2 new docker images based on the centos image that has been downloaded previously. The first image will be used to store data (database devices, dump files) and the second image is used to run the Sybase processes. It is technically possible to use just 1 image.
For data
Run the centos image and start a bash shell. Make a note of the container id that is shown at the prompt.
docker run -t -i centos /bin/bash
Sample output:
docker run -t -i centos /bin/bash [root@2d0c8aae3341 /]#
In this case the container id is 2d0c8aae3341.
yum update
Add the sybase group and user making sure that the uid and gid match with the host
groupadd sybase -g <number> useradd -u <number> -g sybase sybase exit
Create a new image based on the actions we have made
docker commit -m "sybase data image" -a "Peter Sap" <container-ID> sybase_data/centos:v1 docker images
For the Sybase processes
Run the centos image once more to install the additional packages that are required to run Sybase processes.
docker run -t -i centos /bin/bash yum update yum install glibc.i686 libaio groupadd sybase -g <free-number> useradd -u <free-number> -g sybase sybase exit docker commit -m "sybase server image" -a "Peter Sap" <2nd container-ID> sybase_server/centos:v1 docker images
Setup storage
In the test case that I have used a disk of 10 Gb was available at /dev/sdb. Modify all storage related instructions to your specific environment.
pvcreate /dev/sdb vgcreate docker_vg /dev/sdb
Create the docker container for the database files
Setup storage
Create a filesystem of 2 Gb for the database files. Consider this as a bare minumum not sized for user databases nor for database dump files.
lvcreate -L 2G -n ASE1_data docker_vg mkfs /dev/docker_vg/ASE1_data mkdir /ASE1_data mount /dev/docker_vg/ASE1_data /ASE1_data chown sybase:sybase /ASE1_data
Create a Dockerfile and the image
mkdir -p /var/docker_projects/sybase_data vi /var/docker_projects/sybase_data/Dockerfile
# Dockerfile for sybase data volume containers FROM sybase_data/centos:v1 MAINTAINER peter@petersap.nl USER sybase
Build the image
docker build -t="sybase/data:v1" /var/docker_projects/sybase_data
Create the container
docker create --privileged=true -v /ASE1_data:/ASE1_data --name=ASE1_data -t -i sybase/data:v1
Create the container for the Sybase software
Setup storage
Create a filesystem of 6 Gb for the Sybase software.
lvcreate -L 6G -n sybase-ase160.22544 docker_vg mkfs /dev/docker_vg/sybase-ase160.22544 mkdir /sybase-ase160.22544 mount /dev/docker_vg/sybase-ase160.22544 /sybase-ase160.22544 chown sybase:sybase /sybase-ase160.22544
Install the Sybase software
su - sybase cd /sybase-ase160.22544
Copy the Sybase software into the current directory
scp <user>@<server>:<directory>/EBF22544.tgz . tar -xf EBF22544.tgz rm EBF22544.tgz cd ebf22544
Run the installer, install the software in /sybase-ase160.22544. Do not configure any of the products.
./setup.bin cd .. rm -Rf ebf22544
Type exit to go back to root
exit
Create the container
Note that we use the "sybase/data:v1" image again, as we did when the container for the database files was created.
docker create --privileged=true -v /sybase-ase160.22544:/sybase-ase160.22544 --name=ase160.22544 -t -i sybase/data:v1
Create the container to run Sybase ASE
Setup storage
Create a filesystem of 2 Gb to store the errorlog files, startup scripts, etc.
lvcreate -L 2G -n ASE1_server docker_vg mkfs /dev/docker_vg/ASE1_server mkdir /ASE1_server mount /dev/docker_vg/ASE1_server /ASE1_server chown sybase:sybase /ASE1_server
Create a Dockerfile
mkdir -p /var/docker_projects/sybase_server vi /var/docker_projects/sybase_server/Dockerfile
# Dockerfile for sybase server containers FROM sybase_server/centos:v1 MAINTAINER peter@petersap.nl USER sybase
Build the image
docker build -t="sybase/server:v1" /var/docker_projects/sybase_server
Create the container
Change the ip-address 10.0.0.29 to match your own environment. The port numbers 5000 can also be changed. Remember to make the same changes later on.
As you can see below, the "docker create" statement references to the containers that have already been created, using the --volumes-from option.
docker create --hostname=ASE1_server --publish=10.0.0.29:5000:5000 --privileged=true --volumes-from ASE1_data --volumes-from ase160.22544 -v /ASE1_server:/ASE1_server --name=ASE1_server -t -i sybase/server:v1
Build the Sybase ASE server
At this point we have created the containers for the Sybase software (with the software installed), a container for the database devices and a container to run ASE. Now we will start the container for running ASE and build the Sybase server.
Start the container
docker start --attach=true --interactive=true ASE1_server
You should get a bash shell while running the container.
Source in the Sybase environment variables.
. /sybase-ase160.22544/SYBASE.sh
Create a resource file
Create a resource file for building ASE
cd /ASE1_server vi ASE1.rs
sybinit.release_directory: USE_DEFAULT sybinit.product: sqlsrv sqlsrv.server_name: ASE1 sqlsrv.sa_password: secret123 sqlsrv.new_config: yes sqlsrv.do_add_server: yes sqlsrv.network_protocol_list: tcp sqlsrv.network_hostname_list: ASE1_server sqlsrv.network_port_list: 5000 sqlsrv.application_type: USE_DEFAULT sqlsrv.server_page_size: USE_DEFAULT sqlsrv.force_buildmaster: no sqlsrv.master_device_physical_name: /ASE1_data/master.dat sqlsrv.master_device_size: USE_DEFAULT sqlsrv.master_database_size: USE_DEFAULT sqlsrv.errorlog: /ASE1_server/ASE1.errorlog sqlsrv.do_upgrade: no sqlsrv.sybsystemprocs_device_physical_name: /ASE1_data/sybsystemprocs.dat sqlsrv.sybsystemprocs_device_size: USE_DEFAULT sqlsrv.sybsystemprocs_database_size: USE_DEFAULT sqlsrv.sybsystemdb_device_physical_name: /ASE1_data/sybsystemdb.dat sqlsrv.sybsystemdb_device_size: USE_DEFAULT sqlsrv.sybsystemdb_database_size: USE_DEFAULT sqlsrv.tempdb_device_physical_name: /ASE1_data/tempdb.dat sqlsrv.tempdb_device_size: USE_DEFAULT sqlsrv.tempdb_database_size: USE_DEFAULT sqlsrv.default_backup_server: SYB_BACKUP #sqlsrv.addl_cmdline_parameters: PUT_ANY_ADDITIONAL_COMMAND_LINE_PARAMETERS_HERE sqlsrv.do_configure_pci: no sqlsrv.sybpcidb_device_physical_name: PUT_THE_PATH_OF_YOUR_SYBPCIDB_DATA_DEVICE_HERE sqlsrv.sybpcidb_device_size: USE_DEFAULT sqlsrv.sybpcidb_database_size: USE_DEFAULT # If sqlsrv.do_optimize_config is set to yes, both sqlsrv.avail_physical_memory and sqlsrv.avail_cpu_num need to be set. sqlsrv.do_optimize_config: no sqlsrv.avail_physical_memory: PUT_THE_AVAILABLE_PHYSICAL_MEMORY_FOR_ASE_IN_OPTIMIZATION sqlsrv.avail_cpu_num: PUT_THE_AVAILABLE_NUMBER_CPU_FOR_ASE_IN_OPTIMIZATION
Build ASE1
srvbuildres -r ASE1.rs
Add an extra entry to the interfaces file to allow ASE to connect to the backupserver that will be running in another container. Remember to make changes to the ip-address and port number where needed.
vi $SYBASE/interfaces
Add these lines
SYB_BACKUP_docker query tcp ether 10.0.0.29 5001
Modify the corresponding entry in ASE. Also, configure "console logging" to capture the ASE errorlog inside the log file of the running container.
isql -Usa -Psecret123 -SASE1 sp_addserver SYB_BACKUP,null,SYB_BACKUP_docker go sp_configure 'enable console logging',1 go exit
Create a start script
Create a script that will start ASE1 when the docker container is kicked off.
cd /ASE1_server vi start_ASE1.sh
#!/bin/sh # Source in the Sybase environment variables . /sybase-ase160.22544/SYBASE.sh # Start ASE1 ${SYBASE}/${SYBASE_ASE}/install/RUN_ASE1 RET=$? exit ${RET}
chmod +x start_ASE1.sh exit
You should now be back at the root prompt of your Linux centos/redhat host.
Create a new container that will kick off ASE1 when the container starts
As you have seen above, if you start the container you will get a bash prompt. Now we need to build the container once more with the ENTRYPOINT clause in the Dockerfile so start script is executed where container ASE1_server is started.
Create a Dockerfile
mkdir -p /var/docker_projects/ASE1_server cp /var/docker_projects/sybase_server/Dockerfile /var/docker_projects/ASE1_server
Add this line to the new Dockerfile (/var/docker_projects/ASE1_server/Dockerfile)
ENTRYPOINT /ASE1_server/start_ASE1.sh
Create image and container
docker build -t="sybase/ase1:v1" /var/docker_projects/ASE1_server docker rm ASE1_server docker create --hostname=ASE1_server --publish=10.0.0.29:5000:5000 --privileged=true --volumes-from ASE1_data --volumes-from ase160.22544 -v /ASE1_server:/ASE1_server --name=ASE1_server -t -i sybase/ase1:v1
Start the container to run ASE1
docker start ASE1_server
Run "docker ps" to see the container running. If it is not running do "docker logs ASE1_server".
docker ps
Build the Sybase backup server
Create the container
docker create --hostname=ASE1_BCK_server --publish=10.0.0.29:5001:5001 --privileged=true --volumes-from ASE1_server --name=ASE1_BCK_server -t -i sybase/server:v1
Build the Sybase backup server
docker start --attach=true --interactive=true ASE1_BCK_server
. /sybase-ase160.22544/SYBASE.sh cd /ASE1_server vi SYB_BACKUP.rs
sybinit.release_directory: USE_DEFAULT sybinit.product: bsrv bsrv.server_name: SYB_BACKUP bsrv.new_config: yes bsrv.do_add_backup_server: yes bsrv.do_upgrade: no bsrv.network_protocol_list: tcp bsrv.network_hostname_list: ASE1_BCK_server bsrv.network_port_list: 5001 bsrv.allow_hosts_list: + bsrv.language: USE_DEFAULT bsrv.character_set: USE_DEFAULT bsrv.tape_config_file: USE_DEFAULT bsrv.errorlog: /ASE1_server/SYB_BACKUP.errorlog sqlsrv.related_sqlsrvr: ASE1 sqlsrv.sa_login: sa sqlsrv.sa_password: secret123 #bsrv.addl_cmdline_parameters: PUT_ANY_ADDITIONAL_COMMAND_LINE_PARAMETERS_HERE
srvbuildres -r SYB_BACKUP.rs
Create a start script
Create a script that will start the backup server when the docker container is started
vi start_ASE1_BCK.sh
#!/bin/sh # Source in the Sybase environment variables . /sybase-ase160.22544/SYBASE.sh # Start ASE1_BCK ${SYBASE}/${SYBASE_ASE}/install/RUN_SYB_BACKUP RET=$? exit ${RET}
chmod +x start_ASE1_BCK.sh exit
Create a new container that will kick off ASE1_BCK when the container starts
mkdir -p /var/docker_projects/ASE1_BCK_server cp /var/docker_projects/sybase_server/Dockerfile /var/docker_projects/ASE1_BCK_server
Add this line to the new Dockerfile (/var/docker_projects/ASE1_BCK_server/Dockerfile)
ENTRYPOINT /ASE1_server/start_ASE1_BCK.sh
Create a new image and a new container, remember to change the ip-address and the port number.
docker build -t="sybase/ase1_bck:v1" /var/docker_projects/ASE1_BCK_server docker rm ASE1_BCK_server docker create --hostname=ASE1_BCK_server --publish=10.0.0.29:5001:5001 --privileged=true --volumes-from ASE1_server --name=ASE1_BCK_server -t -i sybase/ase1_bck:v1 docker start ASE1_BCK_server
How to manage the Sybase instances
Sybase ASE and backup server can be stopped and started with docker commands
docker start ASE1_server docker start ASE1_BCK_server docker ps docker stop ASE1_server docker stop ASE1_BCK_server
If you run the "shutdown" command in Sybase ASE the server will stop and the docker container will also end. Same for the backup server if you run "shutdown SYB_BACKUP" in ASE.
If for some reason a server will not start (or crashes) you can examine the console log file
docker logs ASE1_server
All the Sybase files are also accesable on the Linux (centos/Redhat) host so if a container will not start anymore you can still make changes to the configuration.
Wrapping up
add to /etc/fstab
Add the filesystems to /etc/fstab
/dev/docker_vg/sybase-ase160.22544 /sybase-ase160.22544 ext2 defaults 0 0 /dev/docker_vg/ASE1_data /ASE1_data ext2 defaults 0 0 /dev/docker_vg/ASE1_server /ASE1_server ext2 defaults 0 0