728x90

**numpy설치

python : python:3.7.9-stretch 사용

 

$python test.py

[[0. 0.]

 [0. 0.]]

 

--python:alpine(너무 용량적음) -> python:3.7.9-stretch로 변경

 

#python_project/Dockerfile

FROM python:3.7.9-stretch

RUN pip install numpy
COPY ./test.py /mydata/test.py

CMD ["python", "/mydata/test.py"]

 

$docker rmi 83b0142da49b

$docker rmi -f 83b0142da49b

 

$docker build -t mypython .

$docker run mypython

[[0. 0.]

 [0. 0.]]

 

$docker images

REPOSITORY               TAG       IMAGE ID       CREATED              SIZE

mypython                 latest    c5b16cfea223   About a minute ago   984MB

mhee4321/mynodejs        1.0       394f8d8bae45   18 hours ago         224MB

shelltest                1.0       3f513926794b   19 hours ago         72.9MB

addtest                  1.1       cf9609dcf140   20 hours ago         72.9MB

cmdtest                  1.0       86aeec3a829e   20 hours ago         72.9MB

entrypointtest           1.0       266e66594bc1   20 hours ago         72.9MB

addtest                  1.0       16341914ff80   22 hours ago         72.9MB

runtest                  1.0       b5acf655dab3   22 hours ago         72.9MB

python                   latest    e32be9a6f71f   7 days ago           885MB

ubuntu                   16.04     8185511cd5ad   2 weeks ago          132MB

fromtest                 1.0       def6b0094ed7   2 weeks ago          72.9MB

ubuntu                   latest    f63181f19b2f   2 weeks ago          72.9MB

mysql                    5.7       a70d36bc331a   3 weeks ago          449MB

docker/getting-started   latest    021a1b85e641   2 months ago         27.6MB

 

--만든 image -> 내 hub site에 올리기

$docker login

$docker tag mypython:latest mhee4321/mypython:1.0

$docker push mhee4321/mypython:1.0

 

$docker rmi -f c5b16

$docker image pull mhee4321/mypython:1.0

 

$docker run mhee4321/mypython:1.0

https://hub.docker.com/u/mhee4321

<MSA -> Java -> Docker로 배포하는 과정>

ENV -> 환경변수 설정(컨테이너 내부에서 변수처럼 사용)

$echo $TZ => 'Asia/Seoul'

RUN ln (파일경로)

RUN rm RF - directory 강제 삭제

 

 

**Cloud Native Application

  1. MSA

  2. CI/CD

  3. DevOps

  4. Container(docker를 대신하는 CRE-O, container-d를 사용하기도 한다)

 

--Docker 공유 폴더(volume mount)

  • 컨테이너 업데이트

    • 새 버전의 이미지 다운 -> pull

    • 기존 컨테이너 삭제 -> stop, rm

    • 새 이미지를 이용하여 새 컨테이너 실행 -> run

  • 컨테이너 유지 정보

    • AWS S3(cloud storage)

    • 데이터 볼륨

$docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v /my/datadir:/var/lib/mysql mysql:5.7 (--volumn HostPc dir : container dir)

    =>가급적이면 절대경로 사용해주기

 

**django(mac OS) 변경사항 -> upload에서 반영 -> volume mount로 처리하고 쉽게 update

 


-----------------volume mount적용------------------

#python_project/Dockerfile

FROM python:3.7.9-stretch

WORKDIR /mydata
RUN pip install numpy
COPY ./test.py ./test.py

CMD ["python", "test.py"]

$docker build -t mypython .

$docker run mypython

 

#python_project/Dockerfile

FROM python:3.7.9-stretch

ENV FILE=${EXEC_FILE}
WORKDIR /mydata
RUN pip install numpy
# COPY ./test.py ./test.py

# CMD ["python", "test.py"]
CMD python ${FILE}

CMD python ${EXEC_FILE}이라고 써도됨. (ENV줄 제거하고)

 

$docker build -t mypython .

$docker run -e EXEC_FILE=test.py mypython(test.py가 존재하지 않아 오류)

 

#python_project/Dockerfile

FROM python:3.7.9-stretch

WORKDIR /mydata
RUN pip install numpy
COPY ./test.py ./test.py

# CMD ["python", "test.py"]
CMD python ${EXEC_FILE}

 

$docker build -t mypython .

$docker run -e EXEC_FILE=test.py mypython(정상가동)

[[0. 0.]

 [0. 0.]]

 

#python_project/Dockerfile

FROM python:3.7.9-stretch

WORKDIR /mydata
RUN pip install numpy
# COPY ./test.py ./test.py

# CMD ["python", "test.py"]
CMD python ${EXEC_FILE}

 

$docker build -t mypython .

$docker run -v /Users/mhee4/python_project:/mydata -e EXEC_FILE=test.py mypython

  • run을 해야 container가 생성됨 -> 자동으로 hostPC에서 docker container 로 마운팅됨

 

 

host PC에서 수정하는 것이 훨씬 간단, Docker linux VM에서는 vi로 편집해야 함 $docker exec -it, $vi test.py,

 

run -> 새로운 container 만들어져서 실행

copy -> test.py만 복사한 거라 이것만 실행가능 -> 나는 다른 파일 hello.py도 실행하고 싶다. -> mounting 해줘야 함

 

$cp test.py hello.py

$docker run -v /Users/mhee4/python_project:/mydata -it mypython /bin/bash

root@63d0c3a39996:/mydata# ls -al(파일 목록 확인)

root@63d0c3a39996:/mydata# cat hello.py(파일 정보 확인)

 

 

$docker run -v /Users/mhee4/python_project:/mydata -e EXEC_FILE=test.py mypython (test.py -> hostPC에 있는 파일)

$docker run -v /Users/mhee4/python_project:/mydata -e EXEC_FILE=hello.py mypython

 

 


 

  • Docker 네트워크(Bridge -> 생성)

eth0(호스트) -> windows network

docker() -> ethernet

 

  • Bridge network (기본 네트워크 이름)

    • -  $ docker network create --driver bridge [브릿지 이름]

    • -  $ docker run 또는 docker create에서 --net 옵션으로 커스텀 브릿지 사용

  • Host network

    • - 네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 사용

    • -  포트 포워딩 없이 내부 어플리케이션 사용

    • -  $ docker run -it --name network_host --net host ubuntu:16.04

 

ping, http, mysql로 서로 네트워크를 연결할 수 있음

  • None network

    • -  네트워크를 사용하지 않음

    • -  lo 네트워크만 사용, 외부와 단절

  • Container network

    • -  다른 컨테이너의 네트워크 환경 공유

    • -  --net container:[다른 컨테이너의 ID or Name]

    • -  두 컨테이너 사이의 네트워크 정보가 동일

  • Overlay network

    • - 다른 호스트들 간에 네트워크 공유

 

--Docker 정보 확인

§ TomcatMysql Connection

  • -  $ docker inspect <tomcat container>

  • -  $ docker inspect <mysql container>

NetworkID :Bridge? Host?, EndpointID -> containerID

 

§ application.properties 파일

<Tomcat -> Mysql Connetion>

 

 

$docker ps -a

$docker system prune

 

$docker network ls

NETWORK ID     NAME      DRIVER    SCOPE

7f90ca42e951   bridge    bridge    local

420cd608a6bc   host      host      local

e416c0d4213f   none      null      local

 

**mysql db 가동하기

$docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7

$docker ps

$docker inspect mysql

  "Networks": {

                "bridge": {

                    "IPAMConfig": null,

                    "Links": null,

                    "Aliases": null,

                    "NetworkID": "7f90ca42e9514762a25e6e149be091ec16b0bfbda8cbb39ecdb37efaf28c9bbb",

                    "EndpointID": "09e1e68dce7cf6d1f4ab8da235684c356c763978e85a06daec5602ffdc666ebd",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.2",

 

 

$docker network create my-network

$docker network ls

NETWORK ID     NAME         DRIVER    SCOPE

7f90ca42e951   bridge       bridge    local

420cd608a6bc   host         host      local

ab28d8e3a995   my-network   bridge    local

e416c0d4213f   none         null      local

 

$docker network inspect my-network

$docker network connect my-network mysql

 

$docker network inspect my-network

 "Containers": {

            "b9786b4c7b5f931dfec3aedb077b8802fc66d3f12c95f685f0965d4fa9f3afc8": {

                "Name": "mysql",

                "EndpointID": "aa2bce8782ae983d376bec8c4cdcb4f715875a40468665eeada9497f3dec5ed6",

                "MacAddress": "02:42:ac:12:00:02",

                "IPv4Address": "172.18.0.2/16",

                "IPv6Address": ""

            }

        },

 

$docker inspect mysql(network ID 바뀜)

 "Networks": {

                "bridge": {

                    "IPAMConfig": null,

                    "Links": null,

                    "Aliases": null,

                    "NetworkID": "7f90ca42e9514762a25e6e149be091ec16b0bfbda8cbb39ecdb37efaf28c9bbb",

                    "EndpointID": "09e1e68dce7cf6d1f4ab8da235684c356c763978e85a06daec5602ffdc666ebd",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.2",

                    "IPPrefixLen": 16,

                    "IPv6Gateway": "",

                    "GlobalIPv6Address": "",

                    "GlobalIPv6PrefixLen": 0,

                    "MacAddress": "02:42:ac:11:00:02",

                    "DriverOpts": null

                },

                "my-network": {

                    "IPAMConfig": {},

                    "Links": null,

                    "Aliases": [

                        "b9786b4c7b5f"

                    ],

                    "NetworkID": "ab28d8e3a995fb054e4326ad796af1f2e6105cf963037a047be4c345bbfe42dc",

                    "EndpointID": "aa2bce8782ae983d376bec8c4cdcb4f715875a40468665eeada9497f3dec5ed6",

                    "Gateway": "172.18.0.1",

                    "IPAddress": "172.18.0.2",

                    "IPPrefixLen": 16,

                    "IPv6Gateway": "",

                    "GlobalIPv6Address": "",

                    "GlobalIPv6PrefixLen": 0,

                    "MacAddress": "02:42:ac:12:00:02",

                    "DriverOpts": {}

 

$docker run -d -p 8080:8080 mhee4321/mynodejs:1.0

$docker ps

CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                               NAMES

93ca41046716   mhee4321/mynodejs:1.0   "npm start"              18 seconds ago   Up 17 seconds   0.0.0.0:8080->8080/tcp              cranky_lamport

b9786b4c7b5f   mysql:5.7               "docker-entrypoint.s…"   9 minutes ago    Up 9 minutes    0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

 

$docker inspect 93ca

 "Networks": {

                "bridge": {

                    "IPAMConfig": null,

                    "Links": null,

                    "Aliases": null,

                    "NetworkID": "7f90ca42e9514762a25e6e149be091ec16b0bfbda8cbb39ecdb37efaf28c9bbb",

                    "EndpointID": "84efdc999fd323baaac53417167750df92a592a4a7af0b3f4a0f4ed9419cd4a7",

 

 

$docker ps

CONTAINER ID   IMAGE                   COMMAND                  CREATED          STATUS          PORTS                               NAMES

93ca41046716   mhee4321/mynodejs:1.0   "npm start"              3 minutes ago    Up 3 minutes    0.0.0.0:8080->8080/tcp              cranky_lamport

b9786b4c7b5f   mysql:5.7               "docker-entrypoint.s…"   13 minutes ago   Up 13 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

 

$docker network connect my-network cranky_lamport

$docker inspect my-network

 

$docker inspect cranky_lamport -> 같은 네트워크가 됨

 

 

----another terminal 띄우기

$docker exec -it cranky_lamport /bin/sh

/mydata # ping 127.0.0.1

/mydata # ping 172.18.0.2(my-network 주소)

/mydata # ping mysql(container에서 다른 container로 이름으로 접속가능)

 

 

**✏️실습해보기

  1. 현재 2개의 컨테이너가 실행 중

    1. mysql

    2. mynode

  2. mynode에서 mysql을 ping 테스트

    1. docker exec -it [container_id]

    2. ex) ping 172.18.0.2

    3. ex) ping mysql

 

LAB)

  1. LAB1)mysql에서 mynode로 ping 정보 테스트

    1. ping 실행을 위한 프로그램 설치

  2. LAB2)mynode에서 mysql에 접속

    1. mysql client를 설치

 

  1. (mysql -> mynode(cranky_lamport))

$docker exec -it mysql /bin/bash

root@b9786b4c7b5f:/#  ping 172.18.0.3

root@b9786b4c7b5f:/#  apt-get update

root@b9786b4c7b5f:/#  apt-get install iputils-ping

root@b9786b4c7b5f:/#  ping 172.18.0.3

 

root@b9786b4c7b5f:/# hostname -i

172.17.0.2 172.18.0.2

 

 

  1. (mynode -> mysql)

/mydata # hostname -i

172.17.0.3 172.18.0.3

 

$docker run -d -p 13306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql_client --network my-network mysql:5.7

$docker network inspect my-network

$docker exec -it mysql_client /bin/bash

root@7a4e42c9ce22:/# mysql -h172.18.0.2 -uroot -p (mysql 서버로 접속)

root@7a4e42c9ce22:/# mysql -hmysql -uroot -p (-h뒤는 컨테이너의 이름)

 

 

 

$docker network ls

$docker network disconnect my-network cranky_lamport

$docker network disconnect my-network mysql

$docker network disconnect my-network mysql_client

$docker network rm my-network

$docker network ls

7f90ca42e951   bridge    bridge    local

420cd608a6bc   host      host      local

e416c0d4213f   none      null      local

 

$docker inspect mysql_client(network my-network 삭제된 후 실종됨)

$docker network connect bridge mysql_client

$docker inspect mysql_client

"bridge": {

                    "IPAMConfig": {},

                    "Links": null,

                    "Aliases": [],

                    "NetworkID": "7f90ca42e9514762a25e6e149be091ec16b0bfbda8cbb39ecdb37efaf28c9bbb",

                    "EndpointID": "16f2f88af2ee3ca94aa765b80aa815c358a59867a5c30ee6613e770ec6ba9b33",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.4",

                    "IPPrefixLen": 16,

                    "IPv6Gateway": "",

                    "GlobalIPv6Address": "",

                    "GlobalIPv6PrefixLen": 0,

                    "MacAddress": "02:42:ac:11:00:04",

                    "DriverOpts": {}

 

 

$docker network inspect bridge

 "Containers": {

            "7a4e42c9ce22cbbcfc51220f031749cd21be0dd3aba28b3ac4c54af7e21de9a4": {

                "Name": "mysql_client",

                "EndpointID": "16f2f88af2ee3ca94aa765b80aa815c358a59867a5c30ee6613e770ec6ba9b33",

                "MacAddress": "02:42:ac:11:00:04",

                "IPv4Address": "172.17.0.4/16",

                "IPv6Address": ""

            },

            "93ca41046716e1b4c72175b0d66de6af41067667c62464b0a684a98a7defcb90": {

                "Name": "cranky_lamport",

                "EndpointID": "84efdc999fd323baaac53417167750df92a592a4a7af0b3f4a0f4ed9419cd4a7",

                "MacAddress": "02:42:ac:11:00:03",

                "IPv4Address": "172.17.0.3/16",

                "IPv6Address": ""

            },

            "b9786b4c7b5f931dfec3aedb077b8802fc66d3f12c95f685f0965d4fa9f3afc8": {

                "Name": "mysql",

                "EndpointID": "09e1e68dce7cf6d1f4ab8da235684c356c763978e85a06daec5602ffdc666ebd",

                "MacAddress": "02:42:ac:11:00:02",

                "IPv4Address": "172.17.0.2/16",

                "IPv6Address": ""

            }

        },

 

 

 


✏️내가 만들었던 장고 프로젝트를 컨테이너로 만들기 - > 추후에 다시해보기😊

mysql -> container

django -> container

 

$cd docker_file/django_project(container만들 장소)

host PC-/Users/mhee4/docker_volume (volume mount설정한 host dir)

 

$docker ps

 

(base) mhee4@Moonhees-MacBook-Pro django_project % docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql_server -v /Users/mhee4/docker_volume:/var/lib/mysql mysql:5.7

 

  1. 기존 django 프로젝트를 복사(cloud-project -> docker_file/django_project에 복사)

  2. 기존 django 프로젝트가 잘 작동되는지 확인(well)

  3. 데이터베이스를 변경

    1. sqlite3 -> mysql(docker)

  4. django를 Dockerfile로 생성

  5. 컨테이너로 테스트

 

$code .

 

#myproject/settings.py

DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        'ENGINE' : 'django.db.backends.mysql',
        'NAME' : 'mydb',
        'USER' : 'root',
        'PASSWORD' : '',
        'HOST' : '127.0.0.1', => 현재는 컨테이너 외부기 때문에 'mysql_server'라고 쓰면 인식못함
        'PORT' : '3306'
    }
}

 

$python manage.py makemigrations

$python manage.py migrate

$python manage.py createsuperuser

$python manage.py runserver

 

$mysql -h127.0.0.1 -uroot -p

mysql>use mydb;

mysql>create table member(id varchar(20), name varchar(20));

mysql>insert into member(id, name) values('admin', 'Administrator');

mysql>select id, name from member;

 

create table news(title text(200), content text(500),company text(50), saved_time text(100));

insert into news(title, content, company, saved_time) values('test1', '경제일보', '테스트기사입니다.', '2021-02-09');

 

**오류 잡기

migrations - init.py 삭제 후 다시 모델 생성하기

컬럼은 textfile 말고 charfield로 하기.

 

(참조)

https://docs.djangoproject.com/en/3.1/ref/databases/#mysql-notes

 

Databases | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 


**장고 기존의 가벼운 bookmark project로 docker image 만들어보기-> 아나콘다 기반

 

#docker_file/mysite

$django-admin startproject mysite

$cd mysite

$python manage.py startapp bookmark

$code .

 

code 완성 후,

$python manage.py makemigrations

$python manage.py migrate

$python manage.py createsuperuser

$python manage.py runserver

  1. pip install django

  2. pip install mysqlclient

  3. python manage.py runserver

 

 

$code Dockerfile

 

#docker_file/mysite/Dockerfile

FROM python:3.7.9-stretch

WORKDIR /mydjango

CMD ["python", "--version"]

 

$docker build -t mydjango .

$docker ps -a ->다 지우기

$docker run -it mydjango /bin/bash(확인용)

root@ecf15b94901d:/mydjango#pip list

Package    Version

---------- -------

pip        21.0.1

setuptools 53.0.0

wheel      0.36.2

root@ecf15b94901d:/mydjango# ls -al

total 8

drwxr-xr-x 2 root root 4096 Feb  9 08:11 .

drwxr-xr-x 1 root root 4096 Feb  9 08:12 ..

 

$docker run -v /Users/mhee4/docker_file/mysite:/mydjango -it mydjango /bin/bash

root@be8a9f428463:/mydjango# ls

Dockerfile  bookmark  db.sqlite3  manage.py  mysite

 

root@be8a9f428463:/mydjango#pip install django

root@be8a9f428463:/mydjango# pip install mysqlclient

root@be8a9f428463:/mydjango# python manage.py runserver

 

->port forwarding 필요

 

#docker_file/mysite/Dockerfile

FROM python:3.7.9-stretch

WORKDIR /mydjango

EXPOSE 8000

CMD ["python", "--version"]

 

$docker build -t mydjango .

$docker run -v /Users/mhee4/docker_file/mysite:/mydjango -it -P mydjango /bin/bash

 

root@9283a0795c46:/mydjango# pip install django

root@9283a0795c46:/mydjango# pip install mysqlclient

root@9283a0795c46:/mydjango# python manage.py runserver

 

$docker ps

CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS                     NAMES

9283a0795c46   mydjango   "/bin/bash"   34 seconds ago   Up 33 seconds   0.0.0.0:55000->8000/tcp   thirsty_volhard

 

http://localhost:55000/bookmark/

확인 -> this page isn't working django server가 접근을 제한시켜 놓음

 

^Croot@9283a0795c46:/mydjango# python manage.py runserver 0.0.0.0:8000

http://localhost:55000/bookmark/

 

 

#docker_file/mysite/Dockerfile

FROM python:3.7.9-stretch

WORKDIR /mydjango

RUN pip install django
RUN pip install mysqlclient

EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

$docker build -t mydjango .

$docker run -v /Users/mhee4/docker_file/mysite:/mydjango -it -P mydjango

 

(another terminal)

$docker ps

CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS                     NAMES

c6afe62074c7   mydjango   "python manage.py ru…"   17 seconds ago   Up 16 seconds   0.0.0.0:55002->8000/tcp   sleepy_driscoll

 

http://localhost:55002/bookmark/

 

 

 

 

728x90

+ Recent posts