• gitlab에서 container registry를 사용
  • IP를 사용했기에 SSL 적용 불가
  • SSL을 사용하지 않고 container registry를 사용하에 불안정
  • 향후 gitlab에 SSL 인증서를 사용하여 적용하는 방법 테스트 필요

container registry 활성화를 위하여 gitlab.rb 설정파일 변경

  • container registry 사용하기 위해서는 아래 내용 설정 필요

    $ vi /etc/gitlab/gitlab.rb
    #### ...중략...
    gitlab_rails['gitlab_default_projects_features_container_registry'] = true
    
    ####... 중략...
    ####################################################################
    ## Container Registry settings
    ##! Docs: https://docs.gitlab.com/ee/administration/container_registry.html
    ####################################################################
    
    registry_external_url 'https://IP:8001'
  • gitlab 설정을 변경하였다면 재설정과 재시작
    $ gitlab-ctl reconfigure
  • gitlab 페이지에 container resitry 생성 확인

flask를 활용하여 version 1을 확인할 수 있는 docker 이미지 생성

1. docker 이미지에 사용할 파일 내용 소개

  • version1의 flask 내용 → server.py

    $ vi server.py
    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_world():
        return 'Hello, world!\n'
    
    @app.route('/version')
    def version():
        return 'version 1\n'
    
    if __name__ == '__main__':
        app.run('0.0.0.0', port=9000, debug=True)
  • python 서버를 실행하기 위해 필요한 flask 패키지 다운 → pip을 통해 flask 패키지를 docker 이미지 내에 다운
    $ vi requirements.txt
    Flask==1.1.2
  • docker 이미지를 생성하기 위한 Dockerfile 파일 내용

    $ vi Dockerfile
    FROM python:3.7-alpine
    
    WORKDIR /usr/src/app
    
    COPY . .
    
    RUN pip install --no-cache-dir -r requirements.txt
    EXPOSE 9000
    
    ENTRYPOINT ["python3"]
    
    CMD ["server.py"]

2. docker 이미지 생성 → hippo_flask:v1으로 생성

  • 이미지 이름 : hippo_flask
  • 이미지 tag : v1
    $ docker build -t hippo_flask:v1 ./
    Sending build context to Docker daemon  4.096kB
    Step 1/7 : FROM python:3.7-alpine
    3.7-alpine: Pulling from library/python
    59bf1c3509f3: Already exists
    8786870f2876: Already exists
    [...생략...]
    Step 6/7 : ENTRYPOINT ["python3"]
     ---> Running in 1cc769d232d6
    Removing intermediate container 1cc769d232d6
     ---> 07e5df487c7e
    Step 7/7 : CMD ["server.py"]
     ---> Running in 0383d99cef58
    Removing intermediate container 0383d99cef58
     ---> 64d54ca5156c
    Successfully built 64d54ca5156c
    Successfully tagged hippo_flask:v1
  • 생성한 docker 이미지 확인
    $ docker images hippo_flask
    REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
    hippo_flask      v1        64d54ca5156c   About a minute ago   51.7MB

3. hippo_flask:v1 docker 이미지를 통해 컨테이너 생성과 확인

  • 컨테이너 생성
    $ docker run --name version1 -d -p 9000:9000 hippo_flask:v1
    3d75997676b1f71d80eb72070ac3dbba9695ead6810b8d2a6cefcc1bad83b939
  • 생성된 컨테이너 확인
    $ docker ps | grep version1
    3d75997676b1   hippo_flask:v1         "python3 server.py"      14 seconds ago   Up 13 seconds   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   version1


생성된 컨테이너 통신 테스트

1. 생성된 컨테이너에 트래픽 전송하여 정상적으로 통신 되는지 curl 트래픽 전송 테스트

  • curl 명령어를 통해 통신 확인
    $ curl localhost:9000/version
    version 1

2. 생성된 컨테이너에 for문을 활용하여 연속적으로 트래픽 전송

  • 배포하는 과정에서 변화를 알기 위해 curl를 for 통해 무한 사용
    $ for (( ; ; )) do curl localhost:9000/version; sleep 1; done
    version 1
    version 1
    version 1
    version 1
    version 1
    version 1
    version 1
    ^C

3. 생성한 컨테이너 종료

# 종료할 hippo_flask:v1 컨테이너 확인
$ docker ps | grep hippo_flask
3d75997676b1   hippo_flask:v1         "python3 server.py"      2 minutes ago   Up 2 minutes   0.0.0.0:9000->9000/tcp, :::9000->9000/tcp   version1

# 해당 컨테이너 종료
$ docker rm -f 3d75997676b1


# 컨테이너가 출력되지 않았으므로 정상적으로 삭제된 것 확인
$ docker ps | grep hippo_flask



gitlab private container registry에 이미지 올리기

1. gitlab private container registry 로그인

  • gitlab에 container registry에 로그인 작업 필요 → [서버 IP]:8001로 로그인 시도

  • docker login 명령어 입력 후 Username과 Password를 입력하면 로그인됨

    $ docker login [서버 IP]:8001
    Username: root
    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
  • ※ 참고 → docker repository에 http로 접근하면 오류 발생
    $ docker login [서버 IP]:8001
    Username: root
    Password:
    Error response from daemon: Get "https://서버 IP:8001/v2/": http: server gave HTTP response to HTTPS client
  • 해결 방법 → 접근 시도하는 서버의 docker 설정 변경(insecure-registries 내용 부분 추가)

    $ vi /etc/docker/daemon.json
    {
      "insecure-registries": ["서버 IP:8001"],
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2",
      "storage-opts": [
        "overlay2.override_kernel_check=true"
      ]
    }
    
    # daemon.json를 적용하기 위해 docker 재실행
    $ systemctl retart docker

2. gitlab private container registry에 등록할 image 생성

  • [서버 IP]:8001 주소를 가진 gitlab에 /root/test 경로로 이미지 생성
    $ docker build -t [서버 IP]:8001/root/test .
    Sending build context to Docker daemon  4.096kB
    Step 1/7 : FROM python:3.7-alpine
     ---> a1034fd13493
    Step 2/7 : WORKDIR /usr/src/app
     ---> Using cache
     ---> 5ab0544a8338
    Step 3/7 : COPY . .
     ---> Using cache
     ---> e1867730ab46
    Step 4/7 : RUN pip install --no-cache-dir -r requirements.txt
     ---> Using cache
     ---> 6bb03c2fca00
    Step 5/7 : EXPOSE 9000
     ---> Using cache
     ---> fbbd26c4f799
    Step 6/7 : ENTRYPOINT ["python3"]
     ---> Using cache
     ---> 07e5df487c7e
    Step 7/7 : CMD ["server.py"]
     ---> Using cache
     ---> 64d54ca5156c
    Successfully built 64d54ca5156c
    Successfully tagged 180.70.134.124:8001/root/test:latest
  • 생성 이미지 이름 확인
    $ docker images | grep -i "[서버 IP]:8001"
    [서버 IP]:8001/root/test                    latest         64d54ca5156c   33 minutes ago   51.7MB

3. gitlab private container registry에 이미지 push

  • gitlab private container registry에 push 후http://[서버 IP]:8001/root/test/container_registry 접속해서 로그인하면 업로드된 화면을 확인 가능
    $ docker push hippo7788/hippo_flask:v1
    The push refers to repository [docker.io/hippo7788/hippo_flask]
    fca7f999dd38: Pushed
    07a451b20a57: Pushed
    20093ec82cc4: Pushed
    4df147e7bcb6: Pushed
    880c61470517: Mounted from library/python
    45d4d0cf56eb: Mounted from library/python
    619b8ea44798: Mounted from library/python
    a2f23be74558: Mounted from library/python
    e2eb06d8af82: Mounted from library/python
    v1: digest: sha256:d8a803d8b0d05dd42d0563c4151d370b5f9a50808611a62bdaeffd22332bcdce size: 2204
  • gitlab private container registry에 업로드 확인
  • docker hub에 업로그한 이미지 다운받아서 확인 → 이전에 사용한 컨테이너와 이미지는 삭제

    # 컨테이너 삭제 -> docker ps로 확인 가능
    $ docker rm -f 5fefc9b6e072
    5fefc9b6e072
    
    # 이미지 삭제 -> docker images로 확인 가능
    $ docker rmi -f hippo_flask
    Untagged: hippo_flask:v1
    
    # 이미지 삭제 -> docker images로 확인 가능
    $ docker rmi -f 8dc659fae720
    Untagged: hippo7788/hippo_flask:v1
    Untagged: hippo7788/hippo_flask@sha256:d8a803d8b0d05dd42d0563c4151d370b5f9a50808611a62bdaeffd22332bcdce
    Deleted: sha256:8dc659fae720e2989a727e504fc712a6433500a55ef8bba911fcd802dde65f74
    Deleted: sha256:aa987e77dfe966494d486e3a7d49bcda9e46b3620471911ba59eecd4ca9c7736
    Deleted: sha256:a4c264e5cc48f12f09b0a57670de350bc9ccd4aec7210411a21261938c4bee51
    Deleted: sha256:ea20f857309d14f754678a3de6d98037473656f0654c4392ffb30f3d61d1716c
    Deleted: sha256:9c5b47ae8a6edd9e6d8549dde338997b5cd0e32f97d1b973c36301520afb2590
    Deleted: sha256:be4379647236972f9cee3f1508c8821e619703060c2bb79058f746b36c8a31c3
    Deleted: sha256:54ebb48e2f85190b5ac7a315e667becad4520727455c8e061861d89609dc3d31
    Deleted: sha256:0458e8557286e301e0e59bc2555979a3ebbd0212012b54c25670d7375714b697
    Deleted: sha256:bf7be436ba34ac4068d4c1f1eaf07d1d46ffc6457bc73dc2fd9a1dda39d0cd2b
    Deleted: sha256:38f374f0f73da0d857c17772f78c586cebfc3354f5fe8419a0bdb14a7a47b235
    Deleted: sha256:a944a01d620ff5361172590ce45ea48dc38b8c564a154a99f876ae0bc0e01827



Docker Hub에 올린 이미지를 다운 후 컨테이너 실행 → hippo7788/hippo_flask:v1

1. Docker Hub에 있는 hippo7788/hippo_flask:v1 이미지를 통해 컨테이너 생성

  • 이미지 다운 후 컨테이너 확인

    $ docker run --name version1 -d -p 9000:9000 hippo7788/hippo_flask:v1
    Unable to find image 'hippo7788/hippo_flask:v1' locally
    v1: Pulling from hippo7788/hippo_flask
    a0d0a0d46f8b: Already exists
    c11246b421be: Already exists
    c5f7759615a9: Already exists
    6dc4dde3f226: Already exists
    f2db6ae633c1: Already exists
    9c864080a3a4: Pull complete
    615272ced259: Pull complete
    82808996193e: Pull complete
    71f74dbb2c6d: Pull complete
    Digest: sha256:d8a803d8b0d05dd42d0563c4151d370b5f9a50808611a62bdaeffd22332bcdce
    Status: Downloaded newer image for hippo7788/hippo_flask:v1
    f478fb738e1f7cf8f10a787581910cc8cf5e966bf6c9bc2d328199c996947be1
    
    # 생성된 컨테이너 확인
    $ docker ps | grep version1
    f478fb738e1f        hippo7788/hippo_flask:v1   "python3 server.py"      42 seconds ago      Up 41 seconds       0.0.0.0:9000->9000/tcp   version1
    
    # 생성된 이미지 확인
    $ docker images hippo7788/hippo_flask
    REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
    hippo7788/hippo_flask   v1                  8dc659fae720        2 hours ago         54MB

2. 생성된 컨테이너에 트래픽 전송하여 정상적으로 통신 되는지 curl 트래픽 전송 테스트

  • 다운받은 이미지의 컨테이너가 실행되는 지 테스트
    $ curl localhost:9000/version
    version 1

+ Recent posts