M1 Docker with lima
Last updated
Last updated
lima๋ ์๋ํ์ผ๊ณต์ ์ ํฌํธ ํฌ์๋ฉ(WSL2๊ณผ ์ ์ฌ)์ ์ง์ํ๋ linux vm๊ณผ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๋ค.
lima๋ ์ผ์ข ์ ๋น๊ณต์์ ์ธ "๋งฅ์ ์ํ ์ปจํ ์ด๋"๋ผ ๋ณด๋ฉด ๋๋ค.
โ ์๋ ํ์ผ ๊ณต์ โ ์๋ ํฌํธ ํฌ์๋ฉ โ ์ปจํ ์ด๋ ๊ธฐ๋ฅ ํ์ฌ
docker์ docker-compose๊ฐ ๊น๋ ค์์ง ์๋ค๋ฉด ๊ฐ์ด ์ค์นํ๋ค
homebrew ์์ด ์ค์น๋ฅผ ํ๋ ค ํ๋ค๋ฉด...
\
ํด๋น ํ๋กํ ์คํ์ ๋ค์๊ณผ ๊ฐ๋ค
OS: Ubuntu 21.10 (Impish Indri)
CPU: 4 cores
Memory: 4 GiB
Disk: 100 GiB
Mounts: ~ (read-only), /tmp/lima (writable)
SSH: 127.0.0.1:60022
docker๊ฐ ์ถ๊ฐ๋ docker.yaml ํ๊ฒฝ์ค์ ํ์ผ
docker๋ฅผ ์ด์ฉํ๊ธฐ ์ํด docker.yaml ํ์ผ์ ์ด์ฉํ์ฌ lima๋ฅผ ์คํ์ํจ๋ค. ํด๋น yaml ํ์ผ์ด ์๋ ๊ณณ์ผ๋ก ์ด๋ํ ๋ค์์ ํ์ผ์ ์คํ์ํจ๋ค.
(์ฒจ๋ถํ์ผ์ docker.yaml ํ์ผ์ ๋ค์ด๋ฐ์ผ๋ฉด ๋๋ค.)
์ค์น๊ฐ ์๋ฃ๋๊ธฐ๊น์ง 5๋ถ ์ ๋์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.\
์ค์นํ docker vm ์ด ์ ๋ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
\
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ lima vm์ผ๋ก ์ ์ํ๋ค
(์ดํ์ ๋์ค๋ ๋ช ๋ น์ด๋ค์ ํด๋น lima vm ์ ์ ์ํ์ฌ ์งํํ๋ ๋จ๊ณ๋ค์ด๋ค)
์ ์ํ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker ๊ฐ ์ ์คํ๋๋์ง ํ์ธํ๋ค.
docker-compose up [OPTIONS]
์๋น์ค๋ฅผ ์ํ ์ปจํ ์ด๋๋ฅผ ๋น๋, (์ฌ)์์ฑ, ์์ ๋ฐ ์ฐ๊ฒฐ docker-compose.yml ํ์ผ์ ์์น์์ ์คํ ๊ฐ๋ฅ
docker ps [OPTIONS]
์ปจํ ์ด๋ ์กฐํ
docker images [OPTIONS] [REPOSITORY[:TAG]]
์ด๋ฏธ์ง ์กฐํ
docker volume ls [OPTIONS]
๋ณผ๋ฅจ ์กฐํ
docker-compose down
์ปจํ
์ด๋ ์ค์ง, up
์์ ์์ฑํ ์ปจํ
์ด๋, ๋คํธ์ํฌ, ๋ณผ๋ฅจ ๋ฐ ์ด๋ฏธ์ง ์ ๊ฑฐ
docker rm [OPTIONS] CONTAINER [CONTAINER...]
ํ๋ ์ด์์ ์ปจํ ์ด๋ ์ ๊ฑฐ
docker rmi [OPTIONS] IMAGE [IMAGE...]
ํธ์คํธ ๋ ธ๋์์ ํ๋ ์ด์์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ฑฐ(๋ฐ ํ๊ทธ ํด์ )
docker volume prune [OPTIONS]
์ฌ์ฉํ์ง ์๋ ๋ชจ๋ ๋ก์ปฌ ๋ณผ๋ฅจ ์ ๊ฑฐ
docker exec -it [์ปจํ
์ด๋๋ช
or ์ปจํ
์ด๋ID] bash
์คํ ์ค์ธ ์ปจํ ์ด๋์ ์ ์
\
์ฐ๊ฒฐ๋ ๋ค์์ ์ปจํ ์ด๋๋ฅผ ํ๋๋ก ํตํฉํ์ฌ ๊ด๋ฆฌํ๋ ๋๊ตฌ
docker-compose ์์๋ ์ปจํ ์ด๋ ์คํ์ ์ฌ์ฉ๋๋ ์ต์ ๊ณผ ์ปจํ ์ด๋ ๊ฐ ์์กด์ฑ์ ๋ชจ๋ docker-compose.yml ํ์ผ์ ์ ์ด๋๊ณ , docker-compose ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ์คํ ๋ฐ ๊ด๋ฆฌํ๋ค.
docker-compose๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ lima vmํ๊ฒฝ์ ์ค์นํ์ฌ์ผ ํ๋ค. ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.
์ค์น ํ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker-compose๊ฐ ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํ๋ค.
docker-composeํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ํญ๋ชฉ๋ค๋ก ๊ตฌ์ฑ๋์ด์๋ค.
version:
version: '3'
3๋ง ์ฐ๊ฒ ๋๋ฉด ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ผ๋ก ์ธ์. ๊ตฌ์ฒด์ ์ผ๋ก ๋ฒ์ ์ ๋ช ์ํ ์ ์๋ค.
services:
์๋น์ค๋ค์ ๋ํ ์ ๋ณด ๋ช ์
container_name:
container_name: "local-mongodb"
์ปจํ ์ด๋๋ช ๋ช ์
image:
image: mongo
๊ฐ์ ธ์ฌ ์ด๋ฏธ์ง ๋ช ์
restart:
restart: always
์ปจํ ์ด๋ ์ข ๋ฃ -> ์ฌ์คํ
environment:
environment: MONGO_INITDB_DATABASE: local-db MONGO_INITDB_ROOT_USERNAME: root MONGO_INITDB_ROOT_PASSWORD: password
์ปจํ ์ด๋์ ํ๊ฒฝ๋ณ์ ๋ช ์
ports:
ports: - "27017:27017"
ํฌํธ ๋งคํ ์ ๋ณด ๋ช ์. (ํธ์คํธ:์ปจํ ์ด๋)
volumes:
volumes: - "local-mongodb:/var/lib/mongo"
๋ณผ๋ฅจ ๋งคํ (ํธ์คํธ:์ปจํ ์ด๋)
\
๋ณธ ์์์์๋ mongodb, mysql, redis ๋ฅผ ํฌํจํ๋ ์ปจํ ์ด๋๋ฅผ docker-comopse๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ๋ค.
docker-compose ํ์ผ์ด ์๋ ์์น๋ก ์ด๋ํ์ฌ ํด๋น ํ์ผ์ ์คํ์ํจ๋ค. (์ฒจ๋ถํ์ผ์ docker-compose.yml ํ์ผ์ ๋ค์ด๋ฐ์ผ๋ฉด ๋๋ค.)
(-d ์ต์ : ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์๊ฐ์ ์๋๋ก ํ๋ค.)
ํด๋น ๋ช ๋ น์ด๋ ํ์ผ์ด๋ฆ์ด docker-compose.yml์ธ ๊ฒฝ์ฐ์ ์ฌ์ฉ๊ฐ๋ฅํ๊ณ , ํ์ผ ์ด๋ฆ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
(-f ์ต์ : ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ docker-compose.yml์ด ์๋ ๋ณ๋์ ํ์ผ๋ช ์ ์คํํ ๋ ์ฌ์ฉ)
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker image๋ฅผ ํ์ธํ ์ ์๋ค.
(-a ์ต์ : ์คํ์ค์ด์ง ์๋๋ผ๋ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค)
๋ฐฉ๊ธ์ docker-compose up์ ํ๋ฉด์ ๋ค์ด๋ฐ์ mongo, redis, mysql ์ด๋ฏธ์ง๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.\
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker์ ๋ ์๋ process๋ฅผ ํ์ธํ ์ ์๋ค.
(-a ์ต์ : ์คํ์ค์ด์ง ์๋๋ผ๋ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค)
๋ฐฉ๊ธ์ docker-compose up์ผ๋ก ์คํ์ํจ mongo, redis, mysql ์ด๋ฏธ์ง๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.\
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ํ์ผ๋ก ๋์ด ์ปจํ ์ด๋๋ฅผ ๋ด๋ฆด ์ ์๋ค.
mongo admin -u [์ ์ ๋ช
] -p [๋น๋ฐ๋ฒํธ]
mongo admin -u root -p password
mongodb ์ ์
use [๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
]
use mydb
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ & ์ฌ์ฉ
show dbs
๋ฐ์ดํฐ๋ฒ ์ด์ค ์กฐํ
db
ํ์ฌ ์ฌ์ฉ์ค์ธ DB ์กฐํ
db.createCollection("[์ปฌ๋ ์
๋ช
]")
db.createCollection("person")
collection ์์ฑ
show collections
collection ์กฐํ
db.[์ปฌ๋ ์
๋ช
].insert([JSON format])
db.person.insert({"name" : "hyoung", "email" : "[joonhyuck-hyoung@nhn-commerce.com](mailto:joonhyuck-hyoung@nhn-commerce.com)"})
document(๋ฐ์ดํฐ) ์์ฑ
db.[์ปฌ๋ ์
๋ช
].find()
db.person.find()
document ์กฐํ
db.[์ปฌ๋ ์
๋ช
].remove([JSON format])
db.person.remove({"name":"hyoung"})
document ์ญ์
db.[์ปฌ๋ ์
๋ช
].drop()
db.person.drop()
collection ์ญ์
\
\
docker mysql container ์ ์: $ docker exec -it local-mysql bash
mysql ์ ์: $ mysql -h localhost -P 13306 -u root -p authorization
docker redis container ์ ์: $ docker exec -it local-redis redis-cli
\
\
๋์ปค ์ปจํ ์ด๋์์ ์์ฑ๋๊ฑฐ๋ ์์ ๋ ํ์ผ์ ์ปจํ ์ด๋๊ฐ ํ๊ธฐ๋๋ฉด ํธ์คํธ๋ ํจ๊ป ์ญ์ ๋๋ค.
ํธ์คํธ์ชฝ ํ์ผ ์์คํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ดํธํ๋ฉด ์ปจํ ์ด๋์์ ์ญ์ ํด๋ ํธ์คํธ ํ์ผ ์์คํ ์ ๋จ์์๊ฒ ๋๋ค.
volume ์ข ๋ฅ
Bind Mount ํธ์คํธ ํ๊ฒฝ์ ํน์ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋ ๋ด๋ถ ๋ณผ๋ฅจ ๊ฒฝ๋ก์ ์ฐ๊ฒฐํ์ฌ ๋ง์ดํธํ๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ณด์์ ์ํฅ์ ๋ฏธ์น ์ ์์
Volume (๊ฐ์ฅ ์ผ๋ฐ์ ) ๋์ปค ๋ณผ๋ฅจ์ ๋์ปค ์ปจํ ์ด๋์์ ๋์ปค ๋ด๋ถ์ ๋์ปค ์์ง์ด ๊ด๋ฆฌํ๋ ๋ณผ๋ฅจ์ ์์ฑ ์์ฑ๋ ๋ณผ๋ฅจ์ ํธ์คํธ ๋๋ ํฐ๋ฆฌ์ /var/lib/docker/volumes ๊ฒฝ๋ก์ ์ ์ฅ๋๋ฉฐ, ๋์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ๊ฐ ์ฉ์ด
tmpfs Mount ํธ์คํธ์ ํ์ผ ์์คํ ์ด ์๋, ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉ
\
์ฌ์ ์ค๋น mysql image ๊ฐ ์กด์ฌํ๋ docker-compose.yml ํ์ผ
\
mysql image ๊ฐ ์กด์ฌํ๋ docker-compose.yml ์ ํตํด ์ปจํ
์ด๋ ๋น๋
docker-compose up -d --f
์คํ์ค์ธ mysql ์ปจํ
์ด๋์ ์ ์
docker exec -it [์ปจํ
์ด๋๋ช
or ์ปจํ
์ด๋ID] bash
mysql ์ ๊ทผ
mysql -u [์ ์ ๋ช
] -p [๋น๋ฐ๋ฒํธ]
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ
use [๋ฐ์ดํฐ๋ฒ ์ด์ค๋ช
];
ํ ์คํธ๋ฅผ ์ํ ํ ์ด๋ธ (member_table) ์์ฑ
6. ๋๋ฏธ๋ฐ์ดํฐ ์ถ๊ฐ
INSERT INTO member_table(mb_id, mb_pw, address, mb_tell) VALUES("test", "test", "test", "test");
7. ๋ฐ์ดํฐ ํ์ธ
SELECT * FROM member_table;
8. mysql ์ ๊ทผ ์ข
๋ฃ
exit
docker volume ์์ฑ ํ์ธ
docker volume ls
2. lima ํ๊ฒฝ ๋ด์ ๋ฌผ๋ฆฌ์ ์ ์ฅ์ฅ์ ํ์ธ
cd ~/.local/share/docker/volumes/
cd _data
์ ๊ทผ์ด ๊ฑฐ๋ถ๋๋ฉด sudo -s
3. ํ
์คํธ์ฉ์ผ๋ก ์์ฑํ ํ
์ด๋ธ (member_table) ํ์ธ
root@lima-default:/home/taejun.linux/.local/share/docker/volumes/docker_local-mysql/_data/mydb# ls
member_table.ibd
\
docker-compose down
=> docker-compose up
์ดํ์๋ lima ์์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ ํ์ธ
docker rm -f [์ปจํ
์ด๋๋ช
]
์ ํตํด ์ปจํ
์ด๋๋ฅผ ์ง์๋ lima ์์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ ํ์ธ
mongodb์ ๋ฐ์ดํฐ๋ mysql์ ๋ค๋ฅด๊ฒ ์ง์ ๋ volume์ด ์๋ ํด์๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ํด๋์ ์ ์ฅ๋๋ค.
\
๊ธฐ์กด์ docker image๋ค์ arm64/v8 ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์ด์๋ค. ๊ทธ๋ ๊ธฐ์ ๊ธฐ์กด ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ m1 ํ๋ซํผ ํ๊ฒฝ์ธ linux/x86_64 ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ docker-comopse up์ ํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๋น ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
docker-compose file ์ ๋ค์์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
์ด ๋ฐฉ๋ฒ์ ํด๋น ์ด๋ฏธ์ง๊ฐ ์ด๋ฏธ buildx์ต์ ์ผ๋ก ๋น๋๋์ด ๋์ปค ํ๋ธ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ํตํ๋ค.
2. ํด๋น ์ด๋ฏธ์ง๋ฅผ docker buildx๋ฅผ ์ด์ฉํ์ฌ m1 ํ๋ซํผ๋ ์ง์ํ ์ ์๋๋ก ์ฌ๋น๋ ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ linux/x86_64 ๋ ์ง์ํ๋ ๋ฉํฐํ๋ซํผ ๋น๋์ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ค์์ ๋งํฌ์์ ํ์ธํ ์ ์๋ค.
์ด์ ํด๊ฒฐ์ด ์๋๋ ๊ฒฝ์ฐ์๋ ๊ตฌ๊ธ๋ง์ผ๋ก...
ํ์ฌ redis, mongo, mysql์ m1ํ๊ฒฝ์์ lima๋ฅผ ์ด์ฉํ์ฌ docker-compose ํ์ผ์ ์ด์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋์ ์ง๋ง, kafka + zookeepr์ ๊ฒฝ์ฐ์๋ docker-compose ํ์ผ์ ์ด์ฉํ ์ปจํ ์ด๋๋ฅผ ๋์ฐ๋ ๊ฒ์ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ค.
ํด๋น ๋ถ๋ถ์ ์ถ๊ฐ์ ์ผ๋ก ์ฑ๊ณตํ๋ ๋ฐ๋ก ๋ณธ ๋ด์ฉ์ ์ถ๊ฐํ ์์ ์ด๋ค.
docker-compose๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋์ฐ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋๋ฉด์ ํ๋ก์ธ์ค๊ฐ ๋ ์์ง ๋ชปํ๊ณ ์๊พธ ์ฃฝ๋ ํ์์ ๊ฒช๊ณ ์๋ค.
์ถ์ฒ : Cho Yoohwa, Kang Sunghyuk, Hyoung Joonhyuck
๋ค๋ฅธ ์์ ํ์ผ๋ค์ ์ฌ๊ธฐ์ ํ์ธํ ์ ์๋ค :
docker-compose์ ๋ํ ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ๋ค๋ฉด : \
์ ๋๋ก ์ค์น๋์์ผ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋ฌ๋ค. \
์ ๋๋ก ์ปจํ ์ด๋๊ฐ ๋์์ก๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.