M1 Docker with lima
lima๋
lima๋ ์๋ํ์ผ๊ณต์ ์ ํฌํธ ํฌ์๋ฉ(WSL2๊ณผ ์ ์ฌ)์ ์ง์ํ๋ linux vm๊ณผ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ๋ค.
lima๋ ์ผ์ข ์ ๋น๊ณต์์ ์ธ "๋งฅ์ ์ํ ์ปจํ ์ด๋"๋ผ ๋ณด๋ฉด ๋๋ค.
โ ์๋ ํ์ผ ๊ณต์ โ ์๋ ํฌํธ ํฌ์๋ฉ โ ์ปจํ ์ด๋ ๊ธฐ๋ฅ ํ์ฌ
lima ์ค์น ๋ฐฉ๋ฒ
homebrew๋ฅผ ์ด์ฉํ ์ค์น
docker์ docker-compose๊ฐ ๊น๋ ค์์ง ์๋ค๋ฉด ๊ฐ์ด ์ค์นํ๋ค
homebrew ์์ด ์ค์น๋ฅผ ํ๋ ค ํ๋ค๋ฉด... ์๋ ์ค์น ๋งค๋ด์ผ
lima๊ฐ ์ ๋๋ก ์ค์น ๋๋์ง ํ์ธ
\
lima์ docker ์ค์น ๋ฐฉ๋ฒ ๋ฐ ๋ช
๋ น์ด ์ข
๋ฅ
docker + lima config ํ์ผ
ํด๋น ํ๋กํ ์คํ์ ๋ค์๊ณผ ๊ฐ๋ค
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 ํ๊ฒฝ์ค์ ํ์ผ
๋ค๋ฅธ ์์ ํ์ผ๋ค์ ์ฌ๊ธฐ์ ํ์ธํ ์ ์๋ค : lima/examples
docker.yaml์ ์ด์ฉํ ์ค์น
docker๋ฅผ ์ด์ฉํ๊ธฐ ์ํด docker.yaml ํ์ผ์ ์ด์ฉํ์ฌ lima๋ฅผ ์คํ์ํจ๋ค. ํด๋น yaml ํ์ผ์ด ์๋ ๊ณณ์ผ๋ก ์ด๋ํ ๋ค์์ ํ์ผ์ ์คํ์ํจ๋ค.
(์ฒจ๋ถํ์ผ์ docker.yaml ํ์ผ์ ๋ค์ด๋ฐ์ผ๋ฉด ๋๋ค.)
์ค์น๊ฐ ์๋ฃ๋๊ธฐ๊น์ง 5๋ถ ์ ๋์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.\
์คํ์ค์ธ ๋ฆฌ์คํธ ํ์ธํ๊ธฐ
์ค์นํ docker vm ์ด ์ ๋ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
\
lima ์ ์ ๋ฐ docker ์คํ ๋ช
๋ น์ด
๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ lima vm์ผ๋ก ์ ์ํ๋ค
(์ดํ์ ๋์ค๋ ๋ช ๋ น์ด๋ค์ ํด๋น lima vm ์ ์ ์ํ์ฌ ์งํํ๋ ๋จ๊ณ๋ค์ด๋ค)
์ ์ํ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker ๊ฐ ์ ์คํ๋๋์ง ํ์ธํ๋ค.
๊ฐ๋จํ docker ๋ช
๋ น์ด
docker-compose up [OPTIONS]
์๋น์ค๋ฅผ ์ํ ์ปจํ ์ด๋๋ฅผ ๋น๋, (์ฌ)์์ฑ, ์์ ๋ฐ ์ฐ๊ฒฐ docker-compose.yml ํ์ผ์ ์์น์์ ์คํ ๊ฐ๋ฅ
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
์คํ ์ค์ธ ์ปจํ ์ด๋์ ์ ์
\
lima์์ docker-compose ์ฌ์ฉํ๊ธฐ
docker-compose.yml ๋?
์ฐ๊ฒฐ๋ ๋ค์์ ์ปจํ ์ด๋๋ฅผ ํ๋๋ก ํตํฉํ์ฌ ๊ด๋ฆฌํ๋ ๋๊ตฌ
docker-compose ์์๋ ์ปจํ ์ด๋ ์คํ์ ์ฌ์ฉ๋๋ ์ต์ ๊ณผ ์ปจํ ์ด๋ ๊ฐ ์์กด์ฑ์ ๋ชจ๋ docker-compose.yml ํ์ผ์ ์ ์ด๋๊ณ , docker-compose ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ์คํ ๋ฐ ๊ด๋ฆฌํ๋ค.
docker-compose์ ๋ํ ์์ธํ ๋ด์ฉ์ด ๊ถ๊ธํ๋ค๋ฉด : Docker Compose์ ๋ฒ์ ๋ณ ํน์ง \
lima์์ docker-compose ์ค์นํ๊ธฐ
docker-compose๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ lima vmํ๊ฒฝ์ ์ค์นํ์ฌ์ผ ํ๋ค. ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค.
์ค์น ํ ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker-compose๊ฐ ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํ๋ค.
docker-compose.yml ํญ๋ชฉ
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"
๋ณผ๋ฅจ ๋งคํ (ํธ์คํธ:์ปจํ ์ด๋)
\
docker-comopse๋ก mongodb, mysql, redis ํ๊ฒฝ ์ธํ
ํ๊ธฐ
๋ณธ ์์์์๋ mongodb, mysql, redis ๋ฅผ ํฌํจํ๋ ์ปจํ ์ด๋๋ฅผ docker-comopse๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นํ๋ค.
docker-compose up์ผ๋ก ์ปจํ
์ด๋ ๋์ฐ๊ธฐ
docker-compose ํ์ผ์ด ์๋ ์์น๋ก ์ด๋ํ์ฌ ํด๋น ํ์ผ์ ์คํ์ํจ๋ค. (์ฒจ๋ถํ์ผ์ docker-compose.yml ํ์ผ์ ๋ค์ด๋ฐ์ผ๋ฉด ๋๋ค.)
(-d ์ต์ : ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋์๊ฐ์ ์๋๋ก ํ๋ค.)
ํด๋น ๋ช ๋ น์ด๋ ํ์ผ์ด๋ฆ์ด docker-compose.yml์ธ ๊ฒฝ์ฐ์ ์ฌ์ฉ๊ฐ๋ฅํ๊ณ , ํ์ผ ์ด๋ฆ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ๋ผ๋ฉด ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
(-f ์ต์ : ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ docker-compose.yml์ด ์๋ ๋ณ๋์ ํ์ผ๋ช ์ ์คํํ ๋ ์ฌ์ฉ)
docker image ํ์ธํ๊ธฐ
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker image๋ฅผ ํ์ธํ ์ ์๋ค.
(-a ์ต์ : ์คํ์ค์ด์ง ์๋๋ผ๋ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค)
๋ฐฉ๊ธ์ docker-compose up์ ํ๋ฉด์ ๋ค์ด๋ฐ์ mongo, redis, mysql ์ด๋ฏธ์ง๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.\
docker process ํ์ธํ๊ธฐ
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ docker์ ๋ ์๋ process๋ฅผ ํ์ธํ ์ ์๋ค.
(-a ์ต์ : ์คํ์ค์ด์ง ์๋๋ผ๋ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ณด์ฌ์ค)
๋ฐฉ๊ธ์ docker-compose up์ผ๋ก ์คํ์ํจ mongo, redis, mysql ์ด๋ฏธ์ง๊ฐ ์๋๊ฒ์ ํ์ธํ ์ ์๋ค.\
docker-compose down์ผ๋ก ์ปจํ
์ด๋ ๋ด๋ฆฌ๊ธฐ
๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ํด๋น ํ์ผ๋ก ๋์ด ์ปจํ ์ด๋๋ฅผ ๋ด๋ฆด ์ ์๋ค.
mongodb์ docker-compose.yml
๊ฐ๋จํ MongoDB ๋ช
๋ น์ด
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 ์ญ์
\
mysql์ docker-compose.yml
\
lima์์ docker๋ก ๋์ด mysql ์ ์ํ๊ธฐ
docker mysql container ์ ์: $ docker exec -it local-mysql bash
mysql ์ ์: $ mysql -h localhost -P 13306 -u root -p authorization
redis์ docker-compose.yml
lima์์ docker๋ก ๋์ด redis ์ ์ํ๊ธฐ
docker redis container ์ ์: $ docker exec -it local-redis redis-cli
\
\
docker volume - mount
๋์ปค ์ปจํ ์ด๋์์ ์์ฑ๋๊ฑฐ๋ ์์ ๋ ํ์ผ์ ์ปจํ ์ด๋๊ฐ ํ๊ธฐ๋๋ฉด ํธ์คํธ๋ ํจ๊ป ์ญ์ ๋๋ค.
ํธ์คํธ์ชฝ ํ์ผ ์์คํ ์ ๋ฐ์ดํฐ๋ฅผ ๋ง์ดํธํ๋ฉด ์ปจํ ์ด๋์์ ์ญ์ ํด๋ ํธ์คํธ ํ์ผ ์์คํ ์ ๋จ์์๊ฒ ๋๋ค.
volume ์ข ๋ฅ
Bind Mount ํธ์คํธ ํ๊ฒฝ์ ํน์ ๊ฒฝ๋ก๋ฅผ ์ปจํ ์ด๋ ๋ด๋ถ ๋ณผ๋ฅจ ๊ฒฝ๋ก์ ์ฐ๊ฒฐํ์ฌ ๋ง์ดํธํ๋ค. ์ด ๋ฐฉ๋ฒ์ ๋ณด์์ ์ํฅ์ ๋ฏธ์น ์ ์์
Volume (๊ฐ์ฅ ์ผ๋ฐ์ ) ๋์ปค ๋ณผ๋ฅจ์ ๋์ปค ์ปจํ ์ด๋์์ ๋์ปค ๋ด๋ถ์ ๋์ปค ์์ง์ด ๊ด๋ฆฌํ๋ ๋ณผ๋ฅจ์ ์์ฑ ์์ฑ๋ ๋ณผ๋ฅจ์ ํธ์คํธ ๋๋ ํฐ๋ฆฌ์ /var/lib/docker/volumes ๊ฒฝ๋ก์ ์ ์ฅ๋๋ฉฐ, ๋์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ๊ฐ ์ฉ์ด
tmpfs Mount ํธ์คํธ์ ํ์ผ ์์คํ ์ด ์๋, ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉ
\
Volume mount ํ
์คํธ
์ฌ์ ์ค๋น mysql image ๊ฐ ์กด์ฌํ๋ docker-compose.yml ํ์ผ
\
1.MySQL
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
2. volume mount ํ์ธ
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
\
mount ๊ณผ์ ํ์ธ ๋ฐฉ๋ฒ
docker-compose down
=>docker-compose up
์ดํ์๋ lima ์์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ ํ์ธdocker rm -f [์ปจํ ์ด๋๋ช ]
์ ํตํด ์ปจํ ์ด๋๋ฅผ ์ง์๋ lima ์์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ ํ์ธ
๋ถ๋ก
์๋ฌธ์
mongodb์ ๋ฐ์ดํฐ๋ mysql์ ๋ค๋ฅด๊ฒ ์ง์ ๋ volume์ด ์๋ ํด์๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง ํด๋์ ์ ์ฅ๋๋ค.
\
๊ธฐ์กด ํ๋ก์ ํธ์ docker-compose ํ์ผ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฒช์ ์ ์๋ ์ด๋ ค์
๊ธฐ์กด์ docker image๋ค์ arm64/v8 ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๊ฐ ์์ฑ๋์ด์๋ค. ๊ทธ๋ ๊ธฐ์ ๊ธฐ์กด ์ด๋ฏธ์ง๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฒฝ์ฐ m1 ํ๋ซํผ ํ๊ฒฝ์ธ linux/x86_64 ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ docker-comopse up์ ํ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๋น ์๋ฌ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
docker-compose file ์ ๋ค์์ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
์ด ๋ฐฉ๋ฒ์ ํด๋น ์ด๋ฏธ์ง๊ฐ ์ด๋ฏธ buildx์ต์ ์ผ๋ก ๋น๋๋์ด ๋์ปค ํ๋ธ์ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ํตํ๋ค.
2. ํด๋น ์ด๋ฏธ์ง๋ฅผ docker buildx๋ฅผ ์ด์ฉํ์ฌ m1 ํ๋ซํผ๋ ์ง์ํ ์ ์๋๋ก ์ฌ๋น๋ ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ linux/x86_64 ๋ ์ง์ํ๋ ๋ฉํฐํ๋ซํผ ๋น๋์ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ค์์ ๋งํฌ์์ ํ์ธํ ์ ์๋ค.
Docker buildx build(at M1 Macbook)
์ด์ ํด๊ฒฐ์ด ์๋๋ ๊ฒฝ์ฐ์๋ ๊ตฌ๊ธ๋ง์ผ๋ก...
์ถ๊ฐ ์งํํ ๋ด์ฉ
ํ์ฌ redis, mongo, mysql์ m1ํ๊ฒฝ์์ lima๋ฅผ ์ด์ฉํ์ฌ docker-compose ํ์ผ์ ์ด์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋์ ์ง๋ง, kafka + zookeepr์ ๊ฒฝ์ฐ์๋ docker-compose ํ์ผ์ ์ด์ฉํ ์ปจํ ์ด๋๋ฅผ ๋์ฐ๋ ๊ฒ์ ์ด๋ ค์์ ๊ฒช๊ณ ์๋ค.
ํด๋น ๋ถ๋ถ์ ์ถ๊ฐ์ ์ผ๋ก ์ฑ๊ณตํ๋ ๋ฐ๋ก ๋ณธ ๋ด์ฉ์ ์ถ๊ฐํ ์์ ์ด๋ค.
docker-compose๋ฅผ ์ด์ฉํ์ฌ ์ปจํ ์ด๋๋ฅผ ๋์ฐ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋๋ฉด์ ํ๋ก์ธ์ค๊ฐ ๋ ์์ง ๋ชปํ๊ณ ์๊พธ ์ฃฝ๋ ํ์์ ๊ฒช๊ณ ์๋ค.
์ถ์ฒ : Cho Yoohwa, Kang Sunghyuk, Hyoung Joonhyuck
Last updated