Docker with GUI

: 도커를 사용하다 보면 GUI환경이 제공되지 않아 불편하거나 초기 GUI를 통해 무언가를 설정해야하는 경우가 있다. 이럴 때 유용한, 호스트의 GUI/sound를 공유하는 방법이다.

$ xhost +local:
$ docker run -it \\
    -v /tmp/.X11-unix:/tmp/.X11-unix \\ # mount the X11 socket
    -e DISPLAY=unix$DISPLAY \\ # pass the display
    --device /dev/snd \\ # sound
    --name jay \\
    ubuntu:16.04 /bin/bash
$ xhost -local:root

참고 링크

도커와 Host PC간 파일 전송

Host -> Container
docker cp /path/foo.txt myContainer:/path/foo.txt

Container -> Host
docker cp myContainer:/path/foo.txt /path/foo.txt

현재 OS 이미지를 Docker로 저장

: 현재 실행중인 부트 이미지를 Docker 이미지로 추출하는 방법이다.

  1. 현재 OS를 tar 파일로 묶음
    tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos6-base.tar(이름 지정) /
  2. docker 서버로 tar 파일을 복사 후 docker에 import
    cat centos6-base.tar | docker import - centos6-base(원하는 이미지 이름)
  3. import 정상 확인
    docker run -i -t centos6-base cat /etc/redhat-release

참고링크1참고링크2

docker error response from daemon no command specified 오류 발생 시

: 위와 같은 오류가 발생하는 경우는 보통 Docker 이미지의 실행 시 수행할 COMMAND가 지정되지 않아서이다. 따라서 다음과 같이 docker import --change 'CMD ["/bin/bash","-c","exec /sbin/init --log-target=journal 3>&1"]' tljh.tar myDockerName:tag CMD를 지정해주면된다.
: 위 방법으로 해결되지 않는 경우는, 발생원인이 위와는 다른 케이스이다. 나의 경우는 arm 아키텍쳐의 부팅 이미지를 Docker 컨테이너로 만들어 x86_64 아키텍쳐에서 실행하고자 하였을 때 위와 같은 오류를 접했다. 이는 Docker에 대한 이해가 부족했을 때 발생한 것이다. Docker는 어찌보면 컨테이너를 만들어 하나의 프로세스를 수행하는 것이지 가상화하는 것이 아니기때문에 다른 architecture의 부트 이미지를 돌릴수는 없다.
참고링크

'CICD > Docker' 카테고리의 다른 글

Docker - Docker 기본사항  (0) 2021.02.14

Docker 설치

: 도커의 설치는 아래 가이드를 수행하면 된다.

$ curl -fsSL <https://get.docker.com/> | sudo sh
$ sudo usermod -aG docker $USER # docker 실행 시 root 권한이 필요하므로 현재 user를 group에 추가해준다.
$ sudo service docker restart
$ sudo chmod 666 /var/run/docker.sock # /var/run/docker.sock 파일의 권한을 666으로 변경하여 그룹 내 다른 사용자도 접근 가능하게 변경

간단한 Docker 실행

  • 도커 실행은 다음 명령으로 할 수 있다. docker run --name jay ubuntu:16.04

위 명령을 실행한 후 실행중인 docker를 보면 아래와 같이 보인다.

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                     PORTS     NAMES
53c3dcd50980   ubuntu:16.04   "/bin/bash"               4 seconds ago    Exited (0) 3 seconds ago             jay

이렇게 Exited 상태가 된 것은 COMMAND인 /bin/bash를 수행하도록 설정되어있으므로 단순히 bash 쉘을 실행시키고 종료한다.
종료하지 않고 계속 실행중인 상태로 만들려면 docker run --name jay -it ubuntu:16.04 /bin/bash와 같이 옵션을 주면 된다.
-i는 interactively의 약어, -t는 attach to terminal 이라 생각하면 된다.

docker run 시 사용되는 옵션들은 다음과 같다.
: docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

옵션 설명
-d detached mode, 백그라운드 모드
-p 호스트와 컨테이너의 포트를 연결 (포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e 컨테이너 내에서 사용할 환경변수 설정
–name 컨테이너 이름 설정
–rm 프로세스 종료시 컨테이너 자동 제거
-it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–link 컨테이너 연결 [컨테이너명:별칭]

Docker run에 대한 이해

: docker run 실행 시 docker: Error response from daemon: Conflict. The container name "/ubuntu_test" is already in use by container와 같은 에러를 발견하는 경우가 있다. 이는 docker run 명령이 "create" 와 "start" 명령을 한번에 실행시키는 명령이기 때문에 create 시 이미 동일한 이름의 컨테이너가 존재하기 때문에 발생한다. 따라서 docker rm <id or name>으로 삭제한 후 다시 실행하면 된다.
: detached 모드로 docker가 종료되지 않고 계속 실행되도록 하려면 docker run -d -it --name ubuntu_test ubuntu을 수행해주어야 한다.

도커를 처음 접할때 오는 멘붕 몇 가지

Docker Life-Cycle command

명령어 의미
run 배포 및 실행 docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/own/datadir:/var/lib/mysql mysql:5.7
stop 실행 중인 Docker 컨테이너를 정지 docker stop ${CONTAINER_ID}
start 정지 중인 Docker 컨테이너를 실행  
rm 배포한 Docker 컨테이너를 삭제  
ps (-a) 실행 중인 (모든) 컨테이너를 표시  

Docker control command

명령어 의미
exec 실행 중인 컨테이너에 명령을 실행 docker exec -it mysql /bin/bash,,, docker exec nginx-vol ls -al
logs 컨테이너의 로그를 표시 docker logs ${CONTAINER_ID}
inpsect 컨테이너/이미지의 상세 정보를 표시  

Docker image-relative command

명령어 의미
images Docer 데몬에 있는 Docker 이미지 목록을 표시  
rmi Docer 데몬에 있는 Docker 이미지를 삭제 docker rmi ${IMAGE_ID}

Tips

|명령어|의미|
|---|---|
|docker rm -v $(docker ps -a -q -f status=exited)|종료 상태인 모든 Docker 컨테이너를 삭제||

Dockerfile

FROM ubuntu:latest
MAINTAINER jay <woghd8754@yonsei.ac.kr>
RUN apt-get -y update
RUN apt-get -y install valgrind
EXPOSE 80 443
CMD ["ls", "-al"]
# 1. ubuntu 설치 (패키지 업데이트 + 만든사람 표시)
FROM       ubuntu:16.04
MAINTAINER subicura@subicura.com
RUN        apt-get -y update

# 2. ruby 설치
RUN apt-get -y install ruby
RUN gem install bundler

# 3. 소스 복사
COPY . /usr/src/app

# 4. Gem 패키지 설치 (실행 디렉토리 설정)
WORKDIR /usr/src/app
RUN     bundle install

# 5. Sinatra 서버 실행 (Listen 포트 정의)
EXPOSE 4567
CMD    bundle exec ruby app.rb -o 0.0.0.0

docker build -t {tag_name} .

'CICD > Docker' 카테고리의 다른 글

Docker - GUI 설정 및 현재 부팅 이미지 이용  (0) 2021.02.14

+ Recent posts