실행중인 docker 컨테이너 환경변수 변경

Docker 2018.01.08 14:20 Posted by 김한별 behonestar

1. container id 알아내기

docker inspect my_container


2. config 파일 변경

vi /var/lib/docker/containers/{container-id}/config.v2.json


3. docker 컨테이너 재시작

docker restart my_container


Dockerfile for gstreamer 1.10.4

Docker 2017.02.28 18:41 Posted by 김한별 behonestar

ubuntu 16.04 Docker 이미지에 gstreamer를 설치하는 Dockerfile입니다.

필요하지 않은 플러그인 설치 코드는 제거하고 사용하시면 됩니다.


FROM ubuntu:16.04


RUN apt-get -y update

RUN apt-get install -y vim

RUN apt-get install -y bison

RUN apt-get install -y g++

RUN apt-get install -y flex

RUN apt-get install -y wget

RUN apt-get install -y pkg-config

RUN apt-get install -y gettext

RUN apt-get install -y zlib1g-dev

RUN apt-get install -y yasm

RUN apt-get install -y libpcre3 libpcre3-dev


RUN apt-get install -y python2.7

RUN apt-get install -y python-pip

RUN export PYTHON=/usr/bin/python2.7


# install glib

WORKDIR /root

RUN wget ftp://sourceware.org/pub/libffi/libffi-3.2.tar.gz

RUN tar -zxvf libffi-3.2.tar.gz

WORKDIR /root/libffi-3.2

RUN sed -e '/^includesdir/ s/$(libdir).*$/$(includedir)/' \

    -i include/Makefile.in && sed -e '/^includedir/ s/=.*$/=@includedir@/' \

    -e 's/^Cflags: -I${includedir}/Cflags:/' \

    -i libffi.pc.in && ./configure --prefix=/usr --disable-static && make

RUN make install


WORKDIR /root

RUN wget http://ftp.gnome.org/pub/gnome/sources/glib/2.48/glib-2.48.2.tar.xz

RUN tar xvf glib-2.48.2.tar.xz

WORKDIR /root/glib-2.48.2

RUN ./configure

RUN make && make install


# install gstreamer

WORKDIR /root

RUN wget http://liboil.freedesktop.org/download/liboil-0.3.17.tar.gz

RUN tar -zxvf liboil-0.3.17.tar.gz

WORKDIR /root/liboil-0.3.17

RUN ./configure

RUN make && make install


WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/src/gstreamer/gstreamer-1.10.4.tar.xz

RUN tar -xvf gstreamer-1.10.4.tar.xz

WORKDIR /root/gstreamer-1.10.4

RUN ./configure

RUN make && make install


# install plugins

WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/data/src/gst-plugins-base/gst-plugins-base-1.10.4.tar.xz

RUN tar -xvf gst-plugins-base-1.10.4.tar.xz

WORKDIR /root/gst-plugins-base-1.10.4

RUN ./configure

RUN make && make install


WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.10.4.tar.xz

RUN tar -xvf gst-plugins-good-1.10.4.tar.xz

WORKDIR /root/gst-plugins-good-1.10.4

RUN ./configure

RUN make && make install


WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/data/src/gst-plugins-bad/gst-plugins-bad-1.10.4.tar.xz

RUN tar -xvf gst-plugins-bad-1.10.4.tar.xz

WORKDIR /root/gst-plugins-bad-1.10.4

RUN ./configure

RUN make && make install


WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/src/gst-plugins-ugly/gst-plugins-ugly-1.10.4.tar.xz

RUN tar -xvf gst-plugins-ugly-1.10.4.tar.xz

WORKDIR /root/gst-plugins-ugly-1.10.4

RUN ./configure

RUN make && make install


# install libav

WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/src/gst-libav/gst-libav-1.10.4.tar.xz

RUN tar -xvf gst-libav-1.10.4.tar.xz

WORKDIR /root/gst-libav-1.10.4

RUN ./configure

RUN make && make install


# install gst-rtsp-server

WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/src/gst-rtsp-server/gst-rtsp-server-1.10.4.tar.xz

RUN tar -xvf gst-rtsp-server-1.10.4.tar.xz

WORKDIR /root/gst-rtsp-server-1.10.4

RUN ./configure

RUN make && make install


# install gst-rtsp

WORKDIR /root

RUN wget https://gstreamer.freedesktop.org/src/gst-rtsp/gst-rtsp-server-1.10.4.tar.xz

RUN tar -xvf gst-rtsp-server-1.10.4.tar.xz

WORKDIR /root/gst-rtsp-server-1.10.4

RUN ./configure

RUN make && make install


# install gst-python
RUN apt-get install -y libgirepository1.0-dev
RUN apt-get install -y python-cairo-dev
RUN apt-get install -y libcairo2-dev

WORKDIR /root
RUN wget http://ftp.gnome.org/pub/GNOME/sources/pygobject/3.10/pygobject-3.10.2.tar.xz
RUN tar -xvf pygobject-3.10.2.tar.xz
WORKDIR /root/pygobject-3.10.2
RUN ./configure
RUN make && make install

WORKDIR /root
RUN wget https://gstreamer.freedesktop.org/src/gst-python/gst-python-1.10.4.tar.xz
RUN tar -xvf gst-python-1.10.4.tar.xz
WORKDIR /root/gst-python-1.10.4
RUN ./configure
RUN make && make install

WORKDIR /root
RUN ln -s /usr/lib/x86_64-linux-gnu/libpython2.7.so /usr/lib/libpython2.7.so
RUN ldconfig


Docker port 범위 사용 시 cannot allocate memory 오류

Docker 2016.07.28 14:35 Posted by 김한별 behonestar

증상

넓은 범위의 port를 사용하여 container를 실행하려고 하였더니 cannot allocate memory 오류가 발생하였습니다.


version: '2'

services:

  tunnel_http:

    build: ./tunneling

    ports:

      - "30000-30999:30000-30999"


ERROR: for tunnel_http  driver failed programming external connectivity on endpoint docker_tunnel_http_1 (3e88c0459935f2feb125235551af19769359865534da160db348ca5eb536613f): iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 30818 -j DNAT --to-destination 172.18.0.4:30818 ! -i br-843f9c797ae6:  (fork/exec /sbin/iptables: cannot allocate memory)

Traceback (most recent call last):

  File "<string>", line 3, in <module>

  File "compose/cli/main.py", line 63, in main

AttributeError: 'ProjectError' object has no attribute 'msg'


원인

Docker 설정 중 userland-proxy의 기본값은 true입니다. userland-proxy 방식은 메모리를 많이 사용하기 때문에 port 범위가 넓으면 메모리 부족이 발생할 수 있습니다.


대책

userland-proxy를 사용하지 않도록 daemon.json 파일을 생성하고 아래와 같이 입력합니다.

$ sudo vi /etc/docker/daemon.json

{

        "userland-proxy": false

}


userland-proxy는 컨테이너 내부와 외부의 통신을 위해 userland 영역에서의 구현을 제공합니다. userland-proxy를 비활성화 시키면 Docker는 MASQUERADE iptable 규칙과 net.ipv4.route_localnet 커널 파라미터를 사용합니다. 즉, 일반적으로 사용되는 loopback 주소를 통해 host가 container의 expose된 포트로 연결됩니다. 성능 상의 이유로 후자의 방법이 선호되지만, RHEL6/CentOS6에서는 이를 지원하지 않기 때문에 userland-proxy를 사용하는 것이 기본값이라고 하네요.


참고


docker-compose ports 적용이 안되는 경우

Docker 2016.07.27 16:53 Posted by 김한별 behonestar

증상

Dockerfile에는 EXPOSE를 명시하지 않고 대신 docker-compose.yml에 ports를 설정하였습니다.

그런데 docker-compose run을 하였는데 해당 port가 맵핑되지 않습니다.


docker-compose.yml

version: '2'

services:

  myapp:

    build: ./myapp

    ports:

      - "8080:8080"


myapp container실행

$ docker-compose run -d myapp


바인딩된 포트 확인 (아무것도 없음)

$ netstat -nap | grep 8080



원인 및 대책

docker-compose.yml의 ports: 설정은 docker-compose up 명령으로 실행했을 때만 적용됩니다.
docker-compose run 명령 시에도 적용시키고 싶다면 --service-ports 옵션과 함께 실행해야 합니다.

또는 Dockerfile에 EXPOSE를 명시해두면 docker-compose에 ports를 정의할 필요가 없습니다.


myapp container 실행

$ docker-compose run -d --service-ports myapp

$ docker-compose run -d -p 8080:8080 myapp


참고

  1. https://github.com/docker/compose/issues/1259
  2. https://docs.docker.com/compose/reference/run/


Docker 윈도우 공유 폴더 마운트

Docker 2016.06.16 16:11 Posted by 김한별 behonestar

Boot2Docker 이미지로 생성된 가상 OS는 재부팅 시 일부 디렉토리를 제외한 모든 경로의 데이터를 초기화시킵니다. 따라서 소스코드와 같은 파일들을 가상 OS 내부에서 다루는 것은 위험합니다. 저는 소스코드가 담긴 윈도우 폴더(q-cloud-backend)를 Docker 가상 OS에 마운트시키고 이를 기반으로 컨테이너가 동작하도록 설정해보았습니다.



VirtualBox 공유 폴더 설정











공유 폴더 자동 마운트 설정


1) ssh 로그인 후 bootlocal.sh 생성

docker@default:/$ sudo vi /var/lib/boot2docker/bootlocal.sh

--------------------------------------------------------------------------------------------------

#!/bin/sh


#mount shared directory

mkdir -p /home/docker/q-cloud-backend

mount -t vboxsf source /home/docker/q-cloud-backend


#install docker-compose

curl -L https://github.com/docker/compose/releases/download/1.7.1/docker-compose

chmod +x /usr/local/bin/docker-compose


2) 재부팅

docker@default:/$ sudo reboot -f


Putty로 윈도우 Docker 이미지 접속하기

Docker 2016.06.16 14:36 Posted by 김한별 behonestar

Docker Toolbox 설치

https://www.docker.com/docker-toolbox


Boot2Docker.iso 이미지 설치 및 실행

"Docker Quickstart Terminal"을 실행하면 Boot2Docker.iso 이미지가 VirtualBox에 자동으로 설치된다.


Putty로 접속

1) "Docker Quickstart Terminal"을 실행하여 상단에 표시되는 IP를 확인한다.



2) Putty 접속 (사용자:docker, 비밀번호:tcuser)





TIP! SSH 인증키 사용하여 로그인

1) puttygen 실행

2) File > Load private key

C:\Users\계정명\.docker\machine\machines\default\id_rsa


3) Save private key 버튼을 눌러 원하는 위치에 ppk 파일 저장



4) Putty SSH 인증 설정에 ppk 파일 경로 지정


5) putty로 접속


Docker 모든 컨테이너 삭제 명령

Docker 2016.06.15 15:52 Posted by 김한별 behonestar


모든 컨테이너 삭제하기

docker stop $(docker ps -a -q)

docker rm $(docker ps -a -q)


모든 이미지 삭제하기

docker rmi $(docker images -q)


Exit 상태의 모든 컨테이너 삭제하기

docker rm $(docker ps --filter 'status=exited' -a -q)



Ubuntu 16.04 Docker 설치

Docker 2016.06.14 11:19 Posted by 김한별 behonestar


1. Docker 저장소 GPG key 추가

sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


2. Docker 저장소 추가

echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list


3. APT 업데이트

sudo apt-get update


4. Docker, Docker-compose 설치

sudo apt-get install -y docker-engine

sudo apt-get install -y docker-compose


5. sudo 없이 명령어 사용하도록 설정

sudo usermod -aG docker $(whoami)


6. 명령어 실행

docker -v

docker-compose -v