Lionel Blog

The road is under your feet, the heart looks to the distance

vscode remoteSSH용 docker 생성

  1. 사용자에게 docker 권한 부여하기

    sudo usermod -aG docker $USER
    newgrp docker
  2. Dockerfile 작성

    FROM ubuntu:24.04
    
    # Install required packages for minimal build environment and requested tools
    RUN apt-get update && \
        apt-get install -y \
        build-essential \
        cmake \
        clang-tidy \
        git \
        vim \
        sudo \
        zsh \
        openssh-server \
        locales && \
        apt-get clean && \
        rm -rf /var/lib/apt/lists/*
    
    # Configure locale
    RUN locale-gen en_US.UTF-8
    ENV LANG en_US.UTF-8
    ENV LANGUAGE en_US:en
    ENV LC_ALL en_US.UTF-8
    
    # Create user and group (여기에서 1016 은 기존 서버의 userid 번호를 써줍니다.)
    RUN groupadd -g 1016 lionelj && \
        useradd -u 1016 -g 1016 -m -s /bin/zsh lionelj && \
        usermod -aG sudo lionelj
    
    # Configure SSH
    RUN ssh-keygen -A && \
        chmod 600 /etc/ssh/ssh_host_* && \
        chown root:root /etc/ssh/ssh_host_* && \
        mkdir -p /var/run/sshd && \
        chmod 0755 /var/run/sshd && \
        echo "lionelj ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/lionelj && \
        chmod 0440 /etc/sudoers.d/lionelj && \
        sed -i 's/#Port 22/Port 2222/' /etc/ssh/sshd_config && \
        echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config && \
        echo 'lionelj:qwer' | chpasswd
    
    # Expose SSH port
    EXPOSE 2222
    
    # Start SSH server in background and keep container running
    RUN echo '#!/bin/bash\n\
        sudo /usr/sbin/sshd\n\
        if [ $? -ne 0 ]; then\n\
            echo "Failed to start sshd"\n\
            exit 1\n\
        fi\n\
        tail -f /dev/null' > /start.sh && \
        chmod +x /start.sh
    
    CMD ["/start.sh"]
  3. docker build

    docker build -t lionel-build-env:v1 .
    
    # 잘 성공하면 다음과 같이 나옴
    docker images
    
    REPOSITORY                                           TAG            IMAGE ID       CREATED         SIZE
    lionel-build-env                                     v1             f061ec87e272   8 minutes ago   1.6GB
  4. docker-compose.yml 파일 작성

     version: '3.3'
    
     services:
     lio-container:
     	image: lionel-build-env:v5
     	container_name: lio-container
     	user: 1016:1016
     	networks:
     	my_network:
     		ipv4_address: 172.24.0.2
     	ports:
     	- "2222:2222"
     	volumes:
     	- /home/lionelj:/home/lionelj
     	- /opt:/opt
     	command: /start.sh
    
     networks:
     my_network:
     	driver: bridge
     	ipam:
     	driver: default
     	config:
     		- subnet: 172.24.0.0/24
  5. 컨테이너 실행

    docker-compose up -d
  6. SSH 접속 테스트 (linux 에서 실행)

    ssh -p 2222 lionelj@localhost
  7. 컨테이너 내부 확인 (필요한 경우 linux 에서 실행)

    docker exec -it lio-container /bin/zsh
  8. 컨테이너 중지 및 삭제

    docker-compose down
  9. ip 설정 (host 에서 docker container의 ip를 확인한다. ssh 터널링 설정을 해야 하기 때문)

    sudo docker inspect dc6d671ba3b0 | grep IPAddress
    		"SecondaryIPAddresses": null,
    		"IPAddress": "172.17.0.2",
    				"IPAddress": "172.17.0.2", <== 이 주소를 사용 합니다.
    • 또 다른 ip 확인 방법 (host에서)
    ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    	link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    	inet 127.0.0.1/8 scope host lo
    	   valid_lft forever preferred_lft forever
    1839: eth0@if1840: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    	link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    	inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0  <== 이 주소를 사용 합니다.
    	   valid_lft forever preferred_lft forever
  10. 윈도우에서 터널링 설정

    ssh -L 2222:172.17.0.2:2222 lionelj@<호스트_IP>
    ssh -L 2222:172.17.0.2:2222 lionelj@192.168.71.41
  11. Windows ssh 설정

    C:\Users\lionel.j\.ssh\config 파일을 열고
    
    Host heimdall
      HostName localhost
      User lionelj
      Port 2222
    
    이렇게 추가 후
    vscode 에서 Remote-SSH: Connect to Host...로 heimdall 로 접속.
  12. 뭔가 잘 안되는 것 같으면 다음 명령으로 ssh 접속 테스트를 해 볼 수 있다.

ssh -v heimdall
  1. 기타 간단한 docker 명령어들.
    • docker ps -a : 모든 container 상태 보기

    • docker start <CONTAINER ID 또는 NAME> : container 시작

    • docker stop <CONTAINER ID 또는 NAME> : container 중지

    • docker rm <CONTAINER ID 또는 NAME> : container 삭제

    • docker images : 모든 docker image 보기

    • docker rmi <IMAGE ID> : docker image 삭제

    • docker exec -it <container_id> /bin/bash : 구동 중인 docker 에 접속

    • docker logs <container_id> : docker log 보기

    • docker-compose logs : compose log 보기

    • 컨테이너 띄우기

      docker run -it --name lio-container \
      -v /home/lionelj:/home/lionelj \
      -v /opt:/opt \
      --user 1016:1016 \
      -p 2222:2222 \
      lionel-build-env:v1 \
      /bin/zsh
      
      docker run -d -p 2222:22 --name lio-container lionel-build-env:v1
      • docker-composer.yml 이 있는 디렉토리에서
      • docker-compose ps : 컨테이너 상태 보기
      • docker-compose top : 컨테이너의 top