Ubuntu

[Ubuntu] 우분투 가상 머신 접속과 도커 설치 (1일차)

bo._.h 2022. 9. 19. 20:22
728x90
반응형

우분투 가상 머신 접속과 도커 설치

https://itdream.whitehat.kr/ 사이트에 접속해 실습환경으로 접속한다.

실습 환경에서 터미널로 들어간다.

우분투에서는 다음 명령으로 도커를 설치할 수 있다.

sudo -i # 관리자 권한으로 전환
apt update # 패키지 매니저 업데이트 
apt install docker.io -y # 패키지 매니저를  사용해 도커 설치

도커의 상세 정보를 다음 명령으로 확인할 수 있다.

docker info

도커 이미지 관리

도커 로그인 수행

hub.docker.com 회원가입을 한다. 기억할 수 있는 ID와 패스워드를 사용한다. 이미지에 일일 다운로드 제한이 걸려있어서 우리가 모두 로그인 없이 사용하면 다운로드에 실패하게 될 것이다.

# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to <https://hub.docker.com> to create one.
Username: gasbugs
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
<https://docs.docker.com/engine/reference/commandline/login/#credentials-store>

Login Succeeded

도커 이미지 검색

hub.docker.com 에서 원하는 이미지를 검색하고 다운로드할 수 있다. 우리는 consol/tomcat-7.0 을 사용할 예정이다. 앞에 경로가 없는 것은 공식 이미지로 library가 생략된 것이다.

도커 이미지 다운로드

이미지는 pull 명령을 사용해 다운로드 할 수 있다.

docker pull consol/tomcat-7.0

다운로드가 완료되면 이미지의 풀 네임을 확인할 수 있다. 앞에는 docker.io라는 도메인이 생략되어 있고, 뒤에는 latest라는 최신 버전의 뜻을 가진 단어가 생략되어 있었음을 확인할 수 있다.

docker.io/consol/tomcat-7.0:latest

이미지 목록 확인한다.

docker images 

이미지 실행하기

run 명령을 사용하면 이미지를 바로 컨테이너로 실행할 수 있다. 톰캣 서비스를 시작하고 웹브라우저로 127.0.0.1:80으로 접속하면 톰캣 페이지가 나타난다.

docker run -d -p 80:8080 --name tc consol/tomcat-7.0

옵션 설명

  • run: 컨테이너를 생성하고 실행한다.
  • -d: detach, 백그라운드에 실행한다.
  • -p: publish, 호스트 포트(왼쪽)와 컨테이너 포트(오른쪽) 포트포워딩을 수행
  • —name: 컨테이너의 이름을 짓는다. 이름을 정하지 않으면 랜덤한 이름으로 구성된다.

이미지 정보확인하기

inspect 명령을 사용하면 이미지의 상세 정보를 확인할 수 있다.

# docker inspect consol/tomcat-7.0
[
    {
        "Id": "sha256:7c34bafd11507bff45ed89ae7b2d56da68abd6b0f373c5e2a90393057785cca6",
        "RepoTags": [
            "consol/tomcat-7.0:latest" # 이름
        ],
        "RepoDigests": [
            "consol/tomcat-7.0@sha256:8256b5e8e01fc4f6c1913e1fd70dea95ae656400f70fb1c12157d0e89e1ccaf7"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2015-06-06T05:54:45.287323113Z", # 생성시간
        "Container": "5544910d974f121a6630b9676fe3469ae3cf9656b7263eb05066f31a99fd32b0",
        "ContainerConfig": {
            "Hostname": "eadddbb61a32",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": { # 외부에 오픈되는 포트를 명시
                "8080/tcp": {}, # 웹 서비스
                "8778/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [ # 환경 변수
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tomcat/bin",
                "LANG=C.UTF-8",
                "JAVA_VERSION=7u79",
                "JAVA_DEBIAN_VERSION=7u79-2.5.5-1~deb8u1",
                "JOLOKIA_VERSION=1.3.1",
                "TOMCAT_VERSION=7.0.62",
                "DEPLOY_DIR=/maven",
                "CATALINA_HOME=/opt/tomcat"
            ],
            "Cmd": [ # 프로세스를 실행하는 명령어
                "/bin/sh",
                "-c",
                "#(nop) CMD [\\"/bin/sh\\" \\"-c\\" \\"/opt/tomcat/bin/deploy-and-run.sh\\"]"
            ],
            "Image": "bfc5f40a572ad8d95e5907efb341146879f13be8d1b224d4f6868d06a5220eb8",
            "Volumes": {
                "/opt/tomcat/logs": {},
                "/opt/tomcat/temp": {},
                "/opt/tomcat/work": {},
                "/tmp/hsperfdata_root": {}
            },
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": [],
            "Labels": {}
        },
        "DockerVersion": "1.6.1-rc2",
        "Author": "roland@jolokia.org",
        "Config": {
            "Hostname": "eadddbb61a32",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8080/tcp": {},
                "8778/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/tomcat/bin",
                "LANG=C.UTF-8",
                "JAVA_VERSION=7u79",
                "JAVA_DEBIAN_VERSION=7u79-2.5.5-1~deb8u1",
                "JOLOKIA_VERSION=1.3.1",
                "TOMCAT_VERSION=7.0.62",
                "DEPLOY_DIR=/maven",
                "CATALINA_HOME=/opt/tomcat"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "/opt/tomcat/bin/deploy-and-run.sh"
            ],
            "Image": "bfc5f40a572ad8d95e5907efb341146879f13be8d1b224d4f6868d06a5220eb8",
            "Volumes": {
                "/opt/tomcat/logs": {},
                "/opt/tomcat/temp": {},
                "/opt/tomcat/work": {},
                "/tmp/hsperfdata_root": {}
            },
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": [],
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 601316716,
        "VirtualSize": 601316716,
        # 파일 시스템 관련 정보
        "GraphDriver": {
            "Data": {
                # 이미지의 레이어를 모아서 하나의 디렉토리로 구성
                "LowerDir": "/var/lib/docker/overlay2/638fea3c8b5c949debb387c214e362390b9dda87cac39f96d06f5d1f1322aff2/diff:/var/lib/docker/overlay2/c5169ed3a55f64c8ebce4f2a4272aa6f0c3a0bbfd1f8cd8827f5ae60d0cf0f92/diff:/var/lib/docker/overlay2/29172fc087730072f97aa7605d358b6df5d2de0a71185f00dcd975028fae691b/diff:/var/lib/docker/overlay2/bc9bc318571289582190599d94e5f81e7617ea2adcb7f64400708871efca6941/diff:/var/lib/docker/overlay2/32188c12471d42be55728c03c196c60819b2ac54f96bd5e1729aead1746dd64a/diff:/var/lib/docker/overlay2/8216bbaf1f6bee1dec635ae256d7bce0a166065e06205090c350e902a2b8de43/diff:/var/lib/docker/overlay2/c7077ba0be047f3577125b1086e8c6704fe62546634b764e8ba1fef2c2eb919e/diff:/var/lib/docker/overlay2/35d9be8fc05f37dd7c75d7a89961d8f243f33f739a7cba1901ffd8d0db720b43/diff:/var/lib/docker/overlay2/ab1a22e97ce030b15d7d52424b61af139a7bdf57e01b40e7a2b1e5951b137a55/diff:/var/lib/docker/overlay2/1232f3f3e2803aaaaffd19acdaaf0935e2efb629a472a0edfe7e0075baa65a4d/diff:/var/lib/docker/overlay2/52e5fad5148d8adf8caf0e26402d413e846a374ee0bbd0cc5df29ff989f1f66a/diff:/var/lib/docker/overlay2/0391823a4cee9fc49826d0b9cc23b4fe84812f00348e2fa7451c9ae1c11efb92/diff:/var/lib/docker/overlay2/e745f6eddff6ceee8572a254afbc75a55109293a6364b338bf3faed4c8c0e3cb/diff:/var/lib/docker/overlay2/2994bf83341c11441b3f0d4d607611694b7148315b5f3cbf9d019b6af10fcbbf/diff:/var/lib/docker/overlay2/287f04139c58acbdc7128712cacab5bd59d144612f2bb76185e7c437fe522372/diff:/var/lib/docker/overlay2/0807fb1f87a290e06c1fe0cf88d51c05fe32e77010bff03aeab1ff3aefabbea8/diff:/var/lib/docker/overlay2/0dce9f74b729db6ca3b6d9111f0e7093722a633ec00911534e717803b2414a73/diff:/var/lib/docker/overlay2/171ef857ef03a4db1130a2f10607c26f247faa3760e29bee7635024d1369250b/diff:/var/lib/docker/overlay2/0e7f00a157ca2e63abe0c0d9b2623e9c5afd265681a5837ea88ca4f5719f36c9/diff:/var/lib/docker/overlay2/c5bc3129b43318ae19a44f5f857dedd6a0be944a0dc90044d919c1ad78d5ca79/diff:/var/lib/docker/overlay2/fcf624ab278f1f4d43b426737ddb8340c9aba72a62c0a6e491d4c55629450f50/diff:/var/lib/docker/overlay2/1a8f12fdebec3ee87976520dfa0a1970aa78773bdaa42577b306a3f9655ebc43/diff:/var/lib/docker/overlay2/4b7b2e99902ab4ca2bb0cbeff14c8ddaf1ff3af552330144b3c2323416ecb19b/diff:/var/lib/docker/overlay2/de4c3456bc95c5be2fc973b1430217500e7af785c49caaa3b103f03a698cc3ea/diff:/var/lib/docker/overlay2/8c20042acf9a9f52fde7400ee98900a9950ae98ec16455f0415627a162a57840/diff:/var/lib/docker/overlay2/1b0ef379c1c7068f9bacaaa4b1a1bb4071843982633255d7358fd8a9f1d0b26e/diff",
                # MergedDir = LowerDir + UpperDir
                "MergedDir": "/var/lib/docker/overlay2/6388c752f20e43149f5f99a2a1d6eca8104d586cfa094299b757fd6355ef5351/merged",
                # 컨테이너의 변경사항을 저장하는 곳
                "UpperDir": "/var/lib/docker/overlay2/6388c752f20e43149f5f99a2a1d6eca8104d586cfa094299b757fd6355ef5351/diff",
                # 원자성을 위해 필수로 사용하는 디렉토리
                "WorkDir": "/var/lib/docker/overlay2/6388c752f20e43149f5f99a2a1d6eca8104d586cfa094299b757fd6355ef5351/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:c5cc83103be7b2981f7ebd1354f512b0d544d78f53037e3d9128054633d544b5",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:55aabb022b6a880f761cf2af299cc5d66acddd27eded631ee0f6227c415d3cc3",
                "sha256:34ab461be6c671a29897523cce7b76b6e6804cd91cd54b8521edd1968f4e39c4",
                "sha256:c900a3fbdb49641a807664efb96ebdab799169e276986c168d87e8ea4da82ecc",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:78b32d65e0a59660aa5178f82c3aebb16f5451a41016045145c2ab7596342d3c",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:0bab0fa4ed5aaa82dc52b0143e62c0bf8dce3fd2eccd4f4b03f723625eb17812",
                "sha256:14c44f9f4a1a22f22034105ba3f8681c53f1e44a312c84065b7c8270d9a60992",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:d1a571b7eec96acf772cac2435ecf44c02b80b9cf3f8aeab6638c2305a3c2bd2",
                "sha256:9e5189be98a802151447beebbe4462deabf23dc775f54e299703b64d150be324",
                "sha256:936f772feac2e8e1b54ba6445d06136152a5970051cb93d3e951d96c8a820b0b",
                "sha256:89607351ec2612fb58b19410d3b6cca7d211d344b3d2e9679b5af54b77006b66",
                "sha256:ee3d91310d77693f3aa65fa38c08963feb9973866b0d10b97b12bf6c29907af3",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

이미지 삭제하기

docker rmi <이미지 이름>

컨테이너 라이프 사이클

컨테이너 상태 확인하기

-a: 모든 컨테이너 확인, 이 옵션을 제거하면 정지된 컨테이너는 보이지 않음

# docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS          PORTS                                             NAMES
472ab9f2f2ed   consol/tomcat-7.0   "/bin/sh -c /opt/tom…"   37 minutes ago   Up 37 minutes   8778/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp   tc

컨테이너 정지와 삭제

컨테이너 ID나 이름을 사용하면 쉽게 컨테이너를 정지할 수 있다.

docker stop tc # 정지
docker rm tc # 삭제

컨테이너 생성과 실행

컨테이너 생성은 run 명령과 비슷하다.

docker create -p 80:8080 --name tc consol/tomcat-7.0

생성된 컨테이너는 start 명령으로 실행할 수 있다.

docker start tc

이론은 어려운데 실습은 쉽다. Geek 한 사람들이 하던 걸 docker 해주기 때문이다.

컨테이너에서 사용하면 유용한 명령어

로그를 확인하는 방법

여기서 이야기하는 로그는 컨테이너(프로그램)을 실행하면서 나타나는 출력을 이야기 한다. 리눅스의 디스크립터 중 stdout, stderr로 출력되는 값을 별도로 저장했다가 출력한다.

/var/lib/docker/containers/<컨테이너ID>/<컨테이너ID>-log.json

도커의 logs 명령을 사용하면 다음과 같이 출력된다.

docker logs tc

ssh처럼 접속하기

SSH(리눅스의 CLI 원격 접속 프로그램)처럼 접속 할 수 있다. exec 명령을 사용해 bash를 실행하면 접속이 가능하다.

docker exec -it tc bash

exit 명령을 사용하면 원래의 호스토로 돌아올 수 있다.

파일 가져오기/내보내기

컨테이너에 넣을 파일을 하나 생성하고 넣었다가 다시 가져와보자.

echo test1234 > test.txt # 파일 생성
docker cp test.txt tc:/  # test.txt 파일을 tc 컨테이너에 전달
docker cp tc:/test.txt test2.txt # tc 컨테이너 안에 있는 파일을 현재 디렉토리로 전달
cat test2.txt # 파일 내용 출력

연습문제 (12분만)

1. 기존에 설치된 모든 컨테이너와 이미지 정지 및 삭제

docker stop $(docker ps -a -q) # 전체 컨테이너 중지
docker rm $(docker ps -a -q)   # 전체 컨테이너 삭제
docker rmi $(docker images -q) # 전체 이미지 삭제

2. 도커 허브를 사용해 jenkins 검색하면 대체 이미지를 알려준다.

3. 그 이미지를 사용해 jenkins를 사용하여 설치

docker pull jenkins/jenkins:lts

4. jenkins 포트로 접속하여 웹 서비스 열기 (inspect)

8080이 8이 많이 들어가서 웹 포트로 생각된다. 도커 허브로 접속해서 포트의 정보를 확인하면 50000번 포트에 대한 설명만 보이고 8080포트에 대한 설명은 없다.

https://github.com/jenkinsci/docker/blob/master/README.md

docker run -d -p 80:8080 --name jk jenkins/jenkins:lts

127.0.0.1로 접속하면 패스워드에 대한 힌트에 가 나타난다.

5.초기 패스워드 찾아서 설치화면으로 넘어가기(힌트는 초기 웹 화면에서 나타난다.)

# 로그 확인
docker logs jk

# 파일 확인
docker exec jk cat /var/jenkins_home/secrets/initialAdminPassword

쿠버네티스 다큐멘터리

https://www.youtube.com/watch?v=BE77h7dmoQU

 

728x90
반응형