kevin@hostos1:~$ sudo apt -y install tree
kevin@hostos1:~$ tree
. ├── Desktop ├── Documents ├── Downloads ├── Music ├── Pictures ├── Public ├── Templates └── Videos
1) 일반 프로그래밍
2) 웹 프로그래밍 (socket 프로그래밍)
3) bigdate 분석 (insight를 얻기 위해)
kevin@hostos1:~$ sudo su -
root@hostos1:~# docker pull python:3.8-slim
root@hostos1:~# mkdir LABs
root@hostos1:~# cd LABs/
root@hostos1:~/LABs# mkdir python && cd $_
root@hostos1:~/LABs/python
kevin@hostos1:~$ docker pull vishwasnarayanare/jupyternotebook
root@hostos1:~/LABs/python# vi py_lotto.py
[py_lotto.py]
from random import shuffle
from time import sleep
gamenum = input('로또 게임 회수를 입력하세요: ')
for i in range(int(gamenum)):
balls = [x+1 for x in range(45)]
ret = []
for j in range(6):
shuffle(balls) # balls를 무작위로 섞고,
number = balls.pop() # balls의 제일 마지막 숫자를 추출하고, 제거
ret.append(number) # 추출된 숫자를 ret에 추가
ret.sort()
print('로또번호[%d]: ' %(i+1), end='')
print(ret)
sleep(1)
root@hostos1:~/LABs/python# vi py_http.py
[py_http.py]
from http.server import BaseHTTPRequestHandler, HTTPServer
port = 8900
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.send_header('Content-Type', 'text/html; charset=utf-8')
self.end_headers()
self.wfile.write('<h1>Python Web Server running~</h1>'.encode('utf-8'))
httpd = HTTPServer(('0.0.0.0', port), SimpleHTTPRequestHandler)
print(f'Server running on port:{port}')
httpd.serve_forever()
root@hostos1:~/LABs/python# docker run -itd --name=py-test -p 8900:8900 python:3.8-slim
e41a32f159959fa90a1e5d9890a426036c38cf4a9c70e155bd784a8aa6b0b651
root@hostos1:~/LABs/python# docker ps | grep python
e41a32f15995 python:3.8-slim "python3" 12 seconds ago Up 10 seconds 0.0.0.0:8900->8900/tcp, :::8900->8900/tcp py-test
root@hostos1:~/LABs/python# docker cp py_lotto.py py-test:/py_lotto.py
root@hostos1:~/LABs/python# docker cp py_http.py py-test:/py_http.py
root@hostos1:~/LABs/python# docker exec -it py-test python /py_lotto.py
로또 게임 회수를 입력하세요: 5
로또번호[1]: [6, 20, 23, 33, 42, 43]
로또번호[2]: [6, 11, 13, 30, 32, 43]
로또번호[3]: [2, 13, 24, 38, 41, 43]
로또번호[4]: [3, 7, 20, 27, 40, 42]
로또번호[5]: [21, 30, 31, 35, 40, 44]
root@hostos1:~/LABs/python# docker exec -it py-test python /py_http.py
Server running on port:8900
192.168.56.1 - - [13/Sep/2022 00:51:47] "GET / HTTP/1.1" 200 -
192.168.56.1 - - [13/Sep/2022 00:51:47] "GET /favicon.ico HTTP/1.1" 200 -
kevin@hostos1:~$ docker run -it -p 8888:8888 --name=pyjup vishwasnarayanare/jupyternotebook
http://192.168.56.101:8888/lab?token=efd95098884638a0a53d86ea3981a057c015c446e48ad41e
root@hostos1:~/LABs/node# docker pull node:17-slim
root@hostos1:~/LABs/node# docker run -d -it -p 9000:8800 --name=mynode node:17-slim
root@hostos1:~/LABs/node# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU S PORTS NAMES
5932a071e43e node:17-slim "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:9000->8800/tcp, :::9000->8800/tcp mynode
root@hostos1:~/LABs/node# vi runapp.js
# 내용 var http = require('http'); var content = function(req, resp) { resp.end("Good morning Korea~!" + "\n"); resp.writeHead(200); } var web = http.createServer(content); web.listen(8000);
root@hostos1:~/LABs/node# docker cp runapp.js mynode:/runapp.js
mynode 컨테이너를 실행하여 디렉터리 확인
root@hostos1:~/LABs/node# docker exec -it mynode ls bin dev home lib64 mnt proc run sbin sys usr boot etc lib media opt root runapp.js srv tmp var
root@hostos1:~/LABs/node# docker exec -it mynode node /runapp.js
kevin@hostos1:~$ docker inspect mynode | grep IPAddress
기본 포트번호: 27017
kevin@hostos1:~$ docker pull mongo:5.0
kevin@hostos1:~$ docker run -itd --name=mongodb -p 27017:27017 mongo:5.0
kevin@hostos1:~$ docker ps | grep mongo
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
> use sampledb
switched to db sampledb
> db
sampledb
> db.t1.insert({name: 'arkang', job:'student'})
WriteResult({ "nInserted" : 1 })
> db.t1.find()
{ "_id" : ObjectId("631fe365378044001065a4a6"), "name" : "arkang", "job" : "st
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
sampledb 0.000GB
> show collections
t1
docker pull
docker pull
전 hub.docker.com에서 해당 image 정보 확인 (최신 버전은 비추천)
docker run ... -p 27017:27017 (EXPOSE, 이미지 port번호이며 변경 가능)
docker pull mongo:5
▶ docker hub에서 pull (어떻게 docker hub인 것을 알까요? docker info로 확인 가능)
kevin@hostos1:~$ docker pull mongo:5.0
5.0: Pulling from library/mongo
675920708c8b: Pull complete
6f9c8c301e0f: Pull complete
73738965c4ce: Pull complete
7fd6635b9ddf: Pull complete
73a471eaa4ad: Pull complete
5abd0e4db1c7: Pull complete
90013e6cca25: Pull complete
045ba07b518a: Pull complete
a52094d39d26: Pull complete
Digest: sha256:fb76bf6795acc0b34a8673c4dde3ba6125c849b1d0556855f510de8ef49943b
Status: Downloaded newer image for mongo:5.0
docker.io/library/mongo:5.0
kevin@hostos1:~$ docker info | grep -i registr
Registry: https://index.docker.io/v1/
Insecure Registries:
kevin@hostos1:~$ docker pull gcr.io/google-samples/hello-app:1.0
1.0: Pulling from google-samples/hello-app
59bf1c3509f3: Pull complete
da75187f77d8: Pull complete
Digest: sha256:88b205d7995332e10e836514fbfd59ecaf8976fc15060cd66e85cdcebe7fb356
Status: Downloaded newer image for gcr.io/google-samples/hello-app:1.0
gcr.io/google-samples/hello-app:1.0
kevin@hostos1:~$ docker pull httpd:2.4
2.4: Pulling from library/httpd
7a6db449b51b: Already exists
b4effd428409: Pull complete
6b29c2b62286: Pull complete
c2123effa3fc: Pull complete
152876b0d24a: Pull complete
Digest: sha256:b418eccc8ec9a04dc07596aef200edfa4d2020dc1168654d6a17af145c33cae6
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4
image는 layer, 계층 구조의 집합 형태
1) image의 snapshot이다.
2) process이다.
3) image는 container의 infra(H/W: container의 cgroup이 4대 리소스 제공, OS
Already exists
: 컨테이너를 공유하기 때문에 이미 존재하는 컨테이너는 pull 하지 않아도 사용 가능sha256 암호화 알고리즘으로 Layer들을 압축하여 암호화
kevin@hostos1:~$ docker images | grep httpd
httpd 2.4 a981c8992512 2 weeks ago 145MB
이미지 포트번호(EXPOSE), 이미지 소스 핵심 경로(WORKDIR) 등 확인 가능
image history를 text 파일로 만들어 확인
kevin@hostos1:~$ docker image history mongo:5.0 --no-trunc > httpd_dockerfile.txt
kevin@hostos1:~$ docker image inspect httpd:2.4
이미지 기본 경로 확인 가능
이미지의 저장소 - 디렉터리
format
: 보고싶은 정보 지정 가능 (Json 형식)kevin@hostos1:~$ docker image inspect --format="{{ .Os }}" httpd:2.4
>> linux
kevin@hostos1:~$ docker image inspect --format="{{ .Os }} {{ .Config.ExposedPorts }}" httpd:2.4
>> linux map[80/tcp:{}]
kevin@hostos1:~$ docker image inspect --format="{{ .ContainerConfig.Env }}" httpd:2.4
>> [PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HTTPD_PREFIX=/usr/local/apache2 HTTPD_VERSION=2.4.54 HTTPD_SHA256=eb397feeefccaf254f8d45de3768d9d68e8e73851c49afd5b7176d1ecf80c340 HTTPD_PATCHES=]
kevin@hostos1:~$ docker inspect py-test | grep -i ipaddress
>>
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
kevin@hostos1:~$ docker search httpd
--force
: 강제 삭제도 가능docker image rm python:3.8-slim
삭제하려는 이미지를 참조하고 있는 컨테이너가 있는 경우, 컨테이너를 삭제해야 한다.
docker stop py-test
docker rm py-test
docker image rm python:3.8-slim
== docker rmi python:3.8-slim
kevin@hostos1:~$ docker ps -a
kevin@hostos1:~$ docker ps -a -q
kevin@hostos1:~$ docker ps -a -q --filter 'status=exited'
kevin@hostos1:~$ docker rm $(docker ps -a -q --filter 'status=exited')
kevin@hostos1:~$ vi .bashrc
>> alias cexrm='docker rm $(docker ps -a -q --filter status=exited)'
kevin@hostos1:~$ soruce .bashrc
1) docker login/logout: 현재 프롬프트에 로그인이 되어 있어야 한다. (계정이 존재해야 한다.)
계정자에게 push 하기 위해 ▶ docker.io/aramu
2) docker image tag: 태그를 걸어야 한다. 왜??? 업로드할 주소 입력을 위해 작성 ▶ 버전 관리에 사용
3) docker push:
docker push 계정자 ID/저장소:태그
▶ docker push aramu/이미지명:버전
▶ repo 주소
kevin@hostos1:~$ docker images | grep myweb
kevin@hostos1:~$ docker image tag myweb:1.0 aramu/myweb:1.0
kevin@hostos1:~$ docker push aramu/myweb:1.0
The push refers to repository [docker.io/aramu/myweb]
kevin@hostos1:~$ docker pull jjy9922/myweb:1.0
docker run = [pull] + create + start + [command]
-i
: interactive
-t
: tty(단말) -it
: 작업 수행
-d
: detach(백그라운드로 실행 ▶ nginx: -d
)
-p
: publish host_port:container_port
-e
: 환경변수
-e ... -e ... -e ...
--env-file=env_list
--restart
: 기본값 no
kubernetes는 기본값이 restart=Always로 되어 있음
▶ Auto-healing
restart=always | ...
: 사용자가 직접 stop한 것이 아닌 비정상적인 컨테이너 종료(예기지 못한) 시 자동 재시작--name
: 컨테이너 이름
--rm
: container stop과 동시에 자동 rm 수행 ▶ test용 container에 적합
-u
: 컨테이너의 기본 사용자는 root
이나 특정 계정에서 application 수행 시 -u=kevin
으로 계정을 지정
su - kevin
과 동일-w
: workdir과 같이 컨테이너 내부 접속 시 연결되는 경로 지정
-v
: 볼륨 지정(container to host, container to container ▶ NFS와 유사, 파일이나 디렉터리 공유 가능)
kevin@hostos1:~$ docker run -d --rm centos /bin/ping localhost
-d
: 백그라운드에서 실행(daemon)-rm
: stop되면 자동 삭제cpu memory disk network 사용량을 분석하여 보여주는 명령어
docker port 컨테이너명
/ docker top 컨테이너명
컨테이너의 publish된 port 번호, 컨테이너의 상태정보 확인
컨테이너 재시작
kevin@hostos1:~$ docker restart myweb2
컨테이너 일시 정지
kevin@hostos1:~$ docker pause myweb2
일시정지된 컨테이너 재시작
kevin@hostos1:~$ docker unpause myweb2
컨테이너 이름 변경
kevin@hostos1:~$ docker rename 컨테이너명 변경컨테이너명
컨테이너 내의 변동사항이나 새로운 파일이 생긴 경우(Change: update, delete)
kevin@hostos1:~$ docker diff mycent2
새로운 이미지를 생성 (기존 이미지 수정 불가)