posted by 귀염둥이채원 2019. 3. 28. 16:58

1. 도커 이미지를 통해 mysql 컨테이너 생성
$ docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name mysql_test mysql

-p 3306:3306 : 호스트의 3306포트와 컨테이너의 3306포트를 연결한다. 즉 호스트에 3306포트 접근이 발행하면 해당 컨테이너에 접속이 된다.
-e MYSQL_ROOT_PASSWORD=password : 컨테이너를 생성하면서 환경변수를 지정한다. root계정의 비밀번호를 설정한다.
-name mysql_test : 컨테이너의 이름은 mysql_test로 지정한다.

2. mysql 컨네이너 접속
$ docker exec -it mysql_test bash

3. mysql 접속 

docker run에서 설정한 root 계정의 password를 입력하면 mysql 서버에 접속

$ root@03e1724628e8:/# mysql -u root -p
Enter password: password 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.15 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

posted by 귀염둥이채원 2019. 1. 4. 17:20

문제: CentOS base docker 이미지로 컨테이너를 생성하고 접속하면 아래와 같은 Warning이 출력되었다.

bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_COLLATE: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_MESSAGES: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_NUMERIC: cannot change locale (en_US.UTF-8): No such file or directory

bash: warning: setlocale: LC_TIME: cannot change locale (en_US.UTF-8): No such file or directory


locale 커멘드를 이용해서 현재 시스템에서 사용중인 로케일을 확인해본다.

[root@7b3a3ede1d74 /]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

locale -a 명령어를 사용해서 현재 시스템에서 사용가능한 로케일을 확인한다.

[root@7b3a3ede1d74 /]# locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX

이 정보는 /usr/lib/locale/locale-archive에 있는 정보이다. 위와 비교해보니 en_US.UTF-8 로케일이 없는 것이 문제 상황으로 파악됬다.

로케일을 정의한 파일들은 /usr/share/i18n/locales 폴더 아래에 있고, charmap(캐릭터맵)에 대한 정보는 /usr/share/i18n/charmaps 폴더 아래에 있다. 이 두가지 정보가 localedef의 명령어로 컴파일 되며 컴파일 된 내용은 위에서 보았던 /usr/lib/locale/locale-archive 파일안으로 들어가게 된다.

Centos/Fedora에는 locale-gen가 없다. 대신에 localedef를 사용하면 된다.

아래와 같이 입력해서 필요한 로케일을 컴파일 시킨다.

localedef -v -c -i en_US -f UTF-8 en_US.UTF-8

option 설명

  • v: 일반적으로 무시되는 오류에 대한 추가 경고를 생성
  • c: 경고가 발생하더라도 출력 파일을 작성
  • i: 로케일의 정의 파일
  • f: charmap(캐릭터맵) 정의

중요한 옵션은 if 두 가지이다. 이 두개의 옵션으로 로케일 및 캐릭터 맵을 지정한다. 즉 이 두개가 합쳐져서 en_US.UTF-8이 되는 것이다. 다시 아래와 같이 locale -a를 입력한다.

[root@7b3a3ede1d74 /]# locale -a
C
en_US.utf8
POSIX

en_US.utf8이 추가되었고 에러도 사라졌다.

만약 localedef 명령어가 없다면 아래와 같이 설치한다.

yum reinstall glibc-common


참고: https://blog.seotory.com/post/2017/02/docker-container-locate-error-fix

posted by 귀염둥이채원 2018. 12. 28. 11:05

Dockerfile 작성 및 도커 이미지를 빌드하는 방법이다.


Dockerfile에는 대략적으로 아래와 같은 내용이 기술되어 있다.

1. FROM: centos7 이미지를 사용한다.

2. RUN: yum을 이용해서 필요한 패키지를 설치한다.

3. ARG: 변수에 값을 설정하기 위해서 사용한다.

4. RUN: OS 그룹 및 유저를 생성한다. (sudo를 사용할수 있도록 추가)

5. RUN: 디렉토리를 생성 및 권한 추가


# Dockerfile

 FROM centos:centos7

MAINTAINER Programmer


RUN yum -y update;

RUN yum -y install java-1.8.0-openjdk \

    java-1.8.0-openjdk-devel \

    net-tools \

    which \

    initscripts \

    openssh-server \

    sudo \

    tree


ARG GROUP=project

ARG USER=service

ARG USER_PASS=service

RUN groupadd ${GROUP}

RUN useradd -g ${GROUP} ${GROUP}

RUN useradd -G ${GROUP} ${USER}

RUN echo "${USER_PASS}" | passwd ${USER} --stdin

RUN echo "${USER}    ALL=(ALL)       ALL" >> /etc/sudoers


RUN mkdir -p /system

RUN mkdir -p /log


RUN chown ${GROUP}:${GROUP} /system

RUN chown ${GROUP}:${GROUP} /log


RUN chmod 775 /system

RUN chmod 775 /log


ENV JAVA_HOME /usr/java/jdk1.8.0_171-amd64/jre/


# build docker image

$ docker build -t test_image .


# Run container

$ docker run -d \

--name=test_container \

--cap-add=SYS_ADMIN \

-e "container=docker" \

-v /sys/fs/cgroup:/sys/fs/cgroup:ro \

--tmpfs /run \

--tmpfs /run/lock \

test_image \

/sbin/init


# Start bash in container

$ docker exec -it test_container /bin/bash

posted by 귀염둥이채원 2018. 12. 28. 11:03

도커 컨테이너로 Ubuntu, CentOS 베이스 이미지를 사용할 경우,

기본적인 패키지를 설치가 필요해서 정리한다.


# Ubuntu 기본 패키지 설치

$ apt -y update

$ apt -y install \

net-tools \

vim \

htop \

iftop \

openssh-server \

lrzsz \

tree


# Centos 기본 패키지 설치

$ yum -y update

$ yum -y install \

net-tools \

vim \

htop \

iftop \

openssh-server \

which \

sudo \

tree \

initscripts



posted by 귀염둥이채원 2018. 12. 27. 14:54

컨테이너에 postgresql을 설치하던 중 아래와 같은 에러가 발생했다.

$ /usr/pgsql-10/bin/postgresql-10-setup initdb

Failed to get D-Bus connection: Operation not permitted

failed to find PGDATA setting in postgresql-10.service


문제는 권한이 없는 (non-privileged) 컨테이너를 실행중이라고 한다.

systemd 의 경우 CAP_SYS_ADMIN capability가 필요하다.

도커는 보안을 위해 권한이 없는 컨테이너의 경우 capability 를 활성화 시키지 않는다.

또한 systemd는 컨테이너의 cgroup 파일 시스템에 RO(Read Only) 접근을 필요로 한다.

해결을 위해서는 "–v /sys/fs/cgroup:/sys/fs/cgroup:ro" 구문을 추가해야 한다.


# 문제

$ docker run -d --name centos7.4_postgres centos:7.4.1708 /bin/bash -c "while true; do echo hello world; sleep 1; done"


# 해결

$ docker run -d --name centos7.4_postgres --privileged -it -e container=docker -v /sys/fs/cgroup:/sys/fs/cgroup:ro centos:latest /usr/sbin/init


# 참고 사이트

https://serverfault.com/questions/824975/failed-to-get-d-bus-connection-operation-not-permitted

http://webkebi.zany.kr:9003/board/bView.asp?bCode=13&aCode=14170

posted by 귀염둥이채원 2018. 12. 27. 11:40

Base Image가 CentOs인 컨테이너를 데몬 형태로 기동하는 방법을 정리한다.

Image 이름에 CentOs 버전을 입력하면 원하는 도커 이미지를 받아서 컨테이너를 생성할 수 있다.


# CentOS Docker Image tag 목록

latest, centos7, 7 (docker/Dockerfile)

centos6, 6 (docker/Dockerfile)

centos7.6.1810, 7.6.1810 (docker/Dockerfile)

centos7.5.1804, 7.5.1804 (docker/Dockerfile)

centos7.4.1708, 7.4.1708 (docker/Dockerfile)  --> centos7.4.1708 

centos7.3.1611, 7.3.1611 (docker/Dockerfile)

centos7.2.1511, 7.2.1511 (docker/Dockerfile)

centos7.1.1503, 7.1.1503 (docker/Dockerfile)

centos7.0.1406, 7.0.1406 (docker/Dockerfile)

centos6.10, 6.10 (docker/Dockerfile)

centos6.9, 6.9 (docker/Dockerfile)

centos6.8, 6.8 (docker/Dockerfile)

centos6.7, 6.7 (docker/Dockerfile)

centos6.6, 6.6 (docker/Dockerfile)


# Docker command example

docker run -d --name {Container Name} centos:{Version} /bin/bash -c "while true; do echo hello world; sleep 1; done"


# CentOs6.6 컨테이너 생성

$ docker run -d --name c6.6 centos:6.6 /bin/bash -c "while true; do echo hello world; sleep 1; done"

5956c5d1e710c7bfa42311f2900419207a4eb368c733b5ba5ae736bc536edd6b


# 컨테이너 접속

$ docker exec -it c6.6 /bin/bash


# OS 버전 확인

[root@5956c5d1e710 /]# cat /etc/*rel*

CentOS release 6.6 (Final)

cpe:/o:centos:linux:6:GA


# CentOs7.4 컨테이너 생성

$ docker run -d --name c7.4 centos:7.4.1708 /bin/bash -c "while true; do echo hello world; sleep 1; done"

Unable to find image 'centos:7.4.1708' locally

7.4.1708: Pulling from library/centos

18b8eb7e7f01: Pull complete

Digest: sha256:814ef512b757f3b515e81f60bed29909fd71bc2d3b28ec8cf025eac749712ed9

Status: Downloaded newer image for centos:7.4.1708

b61d9645aafa60560ba1abd6066079082f3fa02fbc0a39179ca0266cf3e75d51


# 컨테이너 접속

$ docker exec -it c7.4 /bin/bash


# OS 버전 확인

[root@b61d9645aafa /]# cat /etc/*rel*

CentOS Linux release 7.4.1708 (Core)

Derived from Red Hat Enterprise Linux 7.4 (Source)

NAME="CentOS Linux"

VERSION="7 (Core)"

ID="centos"

ID_LIKE="rhel fedora"

VERSION_ID="7"

PRETTY_NAME="CentOS Linux 7 (Core)"

ANSI_COLOR="0;31"

CPE_NAME="cpe:/o:centos:centos:7"

HOME_URL="https://www.centos.org/"

BUG_REPORT_URL="https://bugs.centos.org/"


CENTOS_MANTISBT_PROJECT="CentOS-7"

CENTOS_MANTISBT_PROJECT_VERSION="7"

REDHAT_SUPPORT_PRODUCT="centos"

REDHAT_SUPPORT_PRODUCT_VERSION="7"


cat: /etc/prelink.conf.d: Is a directory

CentOS Linux release 7.4.1708 (Core)

CentOS Linux release 7.4.1708 (Core)


# 참고 사이트

https://hub.docker.com/_/centos/

posted by 귀염둥이채원 2018. 12. 27. 11:39

Docker 컨테이너는 단지 명령만 실행하고 그 결과만 보여주는 기능을 수행한다.

즉, 아래와 같은 명령은 "Hello World"를 출력한 후 즉시 종료된다.

$ docker run ubuntu /bin/echo 'Hello world'


만약 컨테이너를 데몬 형태로 실행하기 위해서는 계속 실행될 수 있는 명령이 필요하다.

$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"


아래와 같이 실행해도 컨테이너를 데몬 형태로 실행할 수 있다.

$ docker run -d -it --name my_ubuntu ubuntu

* -d 옵션: Docker의 컨테이너를 백그라운드 프로세스로 실행하는 옵션

* -it 옵션: interactive 모드


※ 참고 사이트 ※

https://www.popit.kr/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%B2%98%EC%9D%8C-docker-%EC%A0%91%ED%95%A0%EB%95%8C-%EC%98%A4%EB%8A%94-%EB%A9%98%EB%B6%95-%EB%AA%87%EA%B0%80%EC%A7%80/

https://blog.pavelsklenar.com/10-useful-docker-commands-tip-tricks/

posted by 귀염둥이채원 2018. 12. 27. 10:52

docker 명령을 반복해서 타이핑하려면 귀찮다.

bashrc 파일에  아래 내용을 복사해서 사용하면 편하다.


# Print List container

alias dps='docker ps --format "table {{.ID}} \t{{.Image}} \t{{.Command}} \t{{.Names}} \t{{.Status}} \t{{.Ports}}"'


# Stop all containers

dstop() { docker stop $(docker ps -a -q); }


# Remove all containers

drm() { docker rm $(docker ps -a -q); }


# Stop and Remove all containers

alias drmf='docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)'


# Remove all images

dri() { docker rmi $(docker images -q); }


# Show all alias related docker

dalias() { alias | grep 'docker' | sed "s/^\([^=]*\)=\(.*\)/\1 => \2/"| sed "s/['|\']//g" | sort; }


# Bash into running container

dbash() { docker exec -it $(docker ps -aqf "name=$1") bash; }


참고 사이트

- https://github.com/tcnksm/docker-alias/blob/master/zshrc

- https://windsock.io/customising-docker-cli-output/