+2

[WIP] Các tiện ích mà Docker đem lại

Công nghệ container tiện thật đấy, cùng xem các tiện ích nó đem lại mà mình đã chôm được nhé.

Thử nghiệm linux

Muốn chạy một lệnh để test trên ubuntu nhưng sợ làm hỏng cái gì đó trên máy tính của mình, hãy thử nó trong container.

tuana9a@tuana9a-XPS-13-9370:~$ docker run --name nghich_ngu_vl -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
tuana9a@tuana9a-XPS-13-9370:~$ docker exec -it nghich_ngu_vl
root@49151b969ec0:/# 
root@49151b969ec0:/# rm -rf --no-preserve-root /
...
rm: cannot remove '/sys/module/snd_pcm_dmaengine/sections/__ksymtab_strings': Read-only file system
rm: cannot remove '/sys/module/snd_pcm_dmaengine/sections/__ksymtab_gpl': Read-only file system
rm: cannot remove '/sys/module/snd_pcm_dmaengine/sections/.rodata.str1.8': Read-only file system
root@49151b969ec0:/# 
root@49151b969ec0:/# ls
bash: /usr/bin/ls: No such file or directory
root@49151b969ec0:/# cd /op
bash: cd: /op: No such file or directory
root@49151b969ec0:/# ls l/a
bash: /usr/bin/ls: No such file or directory
root@49151b969ec0:/# exit
exit
tuana9a@tuana9a-XPS-13-9370:~$ ll
total 396
drwxr-x--- 57 tuana9a tuana9a  4096 Dec  1 20:42 ./
drwxr-xr-x  3 root    root     4096 Feb  1  2023 ../
drwxrwxr-x  6 tuana9a tuana9a  4096 Feb 14  2023 .android/
drwxrwxr-x  3 tuana9a tuana9a  4096 Nov 14  2022 Android/
-rwxrwxr-x  1 tuana9a tuana9a   111 Sep 10 16:08 android-studio.sh*
-rw-rw-r--  1 tuana9a tuana9a   225 Sep  7  2022 .angular-config.json
...

Các bạn có thể thấy mình chạy câu lệnh xóa hết nhưng khi thoát khỏi container, mọi thứ vẫn an toàn. Thực sự lúc chạy lệnh này tay mình cũng hơi run.

Dev container bất kỳ ngôn ngữ nào

Thay vì phải cài các package của các ngôn ngữ lên máy trực tiếp chúng ta có thể chạy project bằng docker-compose với phiên bản ngôn ngữ tương ứng.

node.js

docker-compose.yaml

version: '3'
services:
  app:
    image: node:16-alpine
    ports:
      - "8080:8080"
    working_dir: /app
    volumes:
      - .:/app
    command: sh -c "npm install && npm run dev"

java

docker-compose.yaml

version: '3'
services:
  app:
    image: openjdk:8u322-jdk-oraclelinux8
    ports:
      - "127.0.0.1:8080:8080"
    working_dir: /app
    volumes:
      - .:/app
    env_file:
      - .env
    command: sh -c "java -jar app-1.0.0.jar"

Dùng cli mà không cần cài thêm gì

Chán nản với việc phải chạy apt install, wget tar.gz, rồi nhét chúng vào /usr/local/bin/, $PATH env variable, giờ đa số các cli đều có thể có phiên bản docker của nó.

mysql client

VD: kết nối tới mysql-server sử dụng image mysql

docker run --rm -it --network host mysql:5.7 mysql -h 172.19.0.2 -u root -p
vagrant@tuana9a-dev ~/github.com/tuana9a/infrastructure-as-code/mysql (main*?) $ docker run --rm -it --network host mysql:5.7 mysql -h 172.19.0.2 -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
mysql> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)

mysql> 

mongo

kết nối tới mongo server

sudo docker run --rm -it --network host mongo:5.0 mongosh "mongodb://$MONGO_INITDB_ROOT_USERNAME:$MONGO_INITDB_ROOT_PASSWORD@localhost"

mongodump

sudo docker run --rm -it --network host -v /tmp/dump:/tmp/dump mongo:5.0 mongodump "mongodb://$MONGO_INITDB_ROOT_USERNAME:$MONGO_INITDB_ROOT_PASSWORD@localhost" --out /tmp/dump

mongorestore

sudo docker run --rm -it --network host -v /tmp/dump:/tmp/dump mongo:5.0 mongorestore "mongodb://$MONGO_INITDB_ROOT_USERNAME:$MONGO_INITDB_ROOT_PASSWORD@localhost" /tmp/dump

postgres

dump (why it's works???)

sudo docker run --rm -it --network host -v /tmp/dump/:/tmp/dump/ postgres:16 pg_dumpall -h localhost > /tmp/dump/psql.sql

restore (why it's works???)

sudo docker run --rm -it --network host -v /tmp/dump/:/tmp/dump/ postgres:16 psql -h localhost -f /tmp/dump/psql.sql postgres

curl

docker run --rm curlimages/curl:8.4.0 -L -v https://tuana9a.com

aws-cli

đây là lệnh mình chạy trong CI CD để upload binary của mình lên s3, môi trường chạy CI CD chỉ cần cài duy nhất Docker, còn lại các tools, cli, binary đều có thể kéo từ Docker

docker run --rm -v $AWS_CREDENTIALS:/root/.aws/credentials -v $WORKSPACE:/aws amazon/aws-cli s3api --endpoint-url $S3_ENDPOINT put-object --bucket $BUCKET_NAME --key $OUTPUT_BINARY_NAME-$VERSION --body $DIST_DIR/$OUTPUT_BINARY_NAME

All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.