[Ubuntu] 우분투 가상 머신 접속과 도커 설치 (1일차)
우분투 가상 머신 접속과 도커 설치
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