Docker) 사용

나 안해·2023년 3월 8일
0

Docker

목록 보기
2/4
post-thumbnail

Docker


1. DB 및 table 생성

(터미널이 없으면 여기)
  • docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7 (여기서 5.7을 빼면 최신 버전이 적용돼서 버전문제가 생긴다)
  • docker ps
  • docker exec -it CONTAINER ID bash
  • mysql -u root(user name) -p
  • password는 입력되지 않는거 같아도 되는거니까 그냥 입력
  • show databases;
  • create database mydb;
  • use mydb;
  • show tables;
  • create table user( id varchar(10) primary key, password varchar(10));
  • select * from user;
  • insert into user values ('hong', 'pass');
  • select * from user;

2. 시작할 때

  • docker ps -a
  • docker start containerID
  • docker exec -it containerID bash
  • name -U root -p
  • passward

3. 컨테이너 명령어

  • docker ps -a #모든 컨테이너 출력(정지 컨테이너 포함)
  • docker ps #실행 중인 컨테이너만 출력
  • docker start hello #hello 이름의 컨테이너 시작
  • docker restart hello #hello 이름의 컨테이너 재시작(재부팅)
  • docker attach hello #컨테이너에 접속(bash 쉘 접속)
  • docker stop hello #hello 이름의 컨테이너 종료
  • docker rm hello #hello 이름의 컨테이너 삭제
  • docker rm -f hello #hello 이름의 컨테이너 강제삭제

4. 컨테이너 제거

전체 제거 
docker system prune --all --force
로그 제거
docker system prune --volumes

5. 도커 백업

  • docker login
  • docker images
  • docker image tag 컨테이너명:태그명 seongbaepark/레파지토리명:1.0
  • docker images
  • docker push 복사된 레파지토리명:tag명

6. db테이블 자동생성

  • django-admin startapp users
  • cd ..
  • cd dj+tab
  • ls
  • 생성 후 admin/setting/INSTALLED_APPS에 모듈명.파일명.파일명config -> 설정값
  • models.py

    프로젝트/admin/settings.py의 INSTALLED_APPS에 있는 모듈명.파일명.파일명config은 app에 있는 이름과 같아야 한다

    예시

    • settings에서 한번에 주고 싶으면 settings에는 blog 입력, users와 tags에는 각각 blog.users, blog.tags를 입력
      ※ 주의 : models.py는 자동으로 테이블을 생성해주는 파일이지만 이 과정이 아닌 수동으로 생성하거나 설정값을 주지 않으면 테이블이 생성되지 않는다

7. 마이그레이션

  • migration 폴더 안에 0001_initial.py이 없으면
    python manage.py makemigrations
  • migration 폴더 안에 0001_initial.py이 있으면
    python manage.py migrate

8. DockerFile

  • 버전 이슈에 대한 대처가 쉽다

9. Docker 기반 Django에서 MySQL 연동으로 서버 실행

  • docker ps -a
  • docker image
  • docler create -it 이미지명
  • docker start 컨테이너명

10. MySQL docker compose 파일 설정

1) 경로

WORKSPACE

  • app
  • code
  • data
  • docker
    • api
      • Dockerfile
      • requirements.txt
    • mysql
      • conf.d
        • my.cnf
      • initdb.d
        • schema.sql
        • testdata.sql
      • Dockerfile
  • docker-compose.yml() -> (여기에서의 버전은 compose의 버전)

2) 내부

# api/Dockerfile

FROM python:3.9

WORKDIR /usr/src/server
ADD requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt

CMD ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0", "--port", "8000"]

# requirements.txt

mysqlclient
sqlalchemy
uvicorn
fastapi
pymysql

# mysql/conf.d/my.cnf

[mysqld]
character-set-server=utf8 
skip-character-set-client-handshake 
default-storage-engine=INNODB 
explicit-defaults-for-timestamp=1 
general-log=1 


[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8

[client]
default-character-set=utf8 

# mysql/initdb.d/schema.sql

create table user(
    id varchar(10) primary key,
    password varchar(10),
    name varchar(12),
    age int
)

# mysql/initdb.d/testdata.sql

insert into user (id, password, name, age) values ('hong', 'pass', '홍길동', 20);
insert into user (id, password, name, age) values ('james', 'pass', 'James', 25);
insert into user (id, password, name, age) values ('ann', 'pass', 'Ann', 22);

# mysql/Dockerfile
FROM mysql:5.7

# docker-compose.yml

version: "3.3"

services:
  db:
    container_name: "db"
    build: ./docker/mysql
    restart: always
    tty: true
    environment:
      MYSQL_DATABASE: mydb
      MYSQL_USER: user
      MYSQL_PASSWORD: password 
      MYSQL_ROOT_PASSWORD: password 
    ports:
      - "3306:3306"
    volumes:
      - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d 
      - ./docker/mysql/conf.d:/etc/mysql/conf.d 
      
    networks:
      - local-net

  # FastAPI
  api:
    links:
      - db
    container_name: "api"
    build: ./docker/api
    ports:
      - "8000:8000"
    volumes:
      - ./code:/usr/src/server
    networks:
      - local-net

networks:
  local-net:
    driver: bridge

11. 이미지로 컨테이너 만들기

  1. docker create -it 이미지
  2. docker start name

방법(코드 풀이)

.1 루트에 Dockerfile 생성
FROM python:3.9

WORKDIR /django_web

COPY. .
COPY requirements.txt requirements.txt

CMD ["python", "manage.py", "runserver", "0.0.0.0:!!!!"]
.2 docker-compose.yml 생성
version: "3"

services:
  databases:
    image: mysql
    container_name: 프로젝트명db (굳이 지금 쓰는 db와 같을 필요는 없다)
    volumes:
      - ~/docker/mysql/etc/mysql ('~'==현재경로/)(예시의 mysql은 앞)
      - ~/docker/var/lib/mysql:/var/lib/mysql
      - ~/docker/mysql/var/mysql:/var/log/mysql
    environment:
      - MYSQL_DATAVASE = mydb (settings.py에 있는 DATABASES의 이름)
      - MYSQL_ROOT_PASSWORD = root
      - MYSQL_ROOT_HOST = %
    command: [ '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ]
  ports:
      - 3306:3306  
web:
    container_name: 프로젝트명dj:v1
    image: seongbaepdl:v1
    build: .
    container_name: seongbaepdl:v1
    command:
      - python manage.py reunserver 0:8000
    ports:
      - "!!!!:!!!!"
    volumes:
      - .:/mydj ('.:/'==현재위치)
    expose:
      - "!!!!"  (Dockerfile의 !!!!과 같은 수)
.3 docker compose up

삭제

https://www.lainyzine.com/ko/article/how-to-remove-all-docker-contaniers-and-images/

사용량 확인

docker stats name


0. Error

0.1 error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1": open //./pipe/docker_engine: The system cannot find the file specified.

원인 : 도커 깨짐

해결 1 : 재설치


해결 2 :


sudo service docker stop


sudo rm -rf /var/lib/docker


sudo service docker start

0.2 django.db.utils.OperationalError: (2002, "Can't connect to server on 'localhost' (10061)")

원인 : 도커 미실행

0.3 docker : The term 'docker' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

원인 : 인식 못함

해결 : 파이참 실행시 나오는 안내창 눌러주면 끝나는 문제

0.4 DJANGO.DB.UTILS.OPERATIONALERROR: (1045, "ACCESS DENIED FOR USER 'ROOT'@'LOCALHOST' (USING PASSWORD: YES)")-MYSQL

원인

db 사용자명, 비밀번호 오류

해결

settings의 databases를 참고

0.5 error response from daemon:

원인

도커 스타트 이후 ps에 실행되는 컨테이너가 없어서 시작과 동시에 꺼짐

해결

docker start 해야지...


0.6 컴포즈 에러

0.6.1 failed to solve: rpc error: code = Unknown desc = failed to solve with frontend dockerfile.v0: failed to create
LLB definition: dockerfile parse error line 5: unknown instruction: COPY.

원인

Dockerfile의 COPY의 공백 문제

해결

Dockerfile의 COPY. .을 COPY . .로


0.6.2 Error response from daemon: pull access denied for fastapi-nlp, repository does not exist or may require 'docker

login': denied: requested access to the resource is denied

원인

도커 허브에 해당 이미지가 없는 경우,


0.6.3 module not found

상황

requirements에 적용 됐고 pip install도 완료됐는데 해당 에러가 발생

해결

api 컨테이너로 들어가서 아래의 경로대로 들어간 뒤에 진행

  • cd /
  • cd usr/local/lib/python3.9/site-packages
  • pip install로 해당 모듈 설치

0.6.4 [Errno 99] Cannot assign requested address

원인

ip 주소를 제대로 지정해주지 못한 경우

  • 이번에 발생한 원인은 아마존과 로컬 env나 컴포즈 파일을 바꾸면서 제대로 수정되지 않아서 발생한 문제

해결

-ip=0.0.0.0 으로 지정해주면 정상적으로 실행


0.6.5 pymysql.err.OperationalError: (1130, "IP' is not allowed to connect to this MySQL server")

해결

도커DB로 들어가서 grant all privileges on . to 'root'@'%' identified by 'root';로 권한주면 끝

0개의 댓글