Manuel de commande pratique Docker
Bonjour à tous, je suis Bittao. Cet article résume le manuel super pratique des commandes Docker.Cet article est adapté aux étudiants qui ont une certaine base Docker. Si vous n'êtes pas familier avec Docker, vous ne pourrez peut-être pas utiliser ces commandes directement. Mais ne vous inquiétez pas, Docker lui-même est un outil, et cela ne prend pas beaucoup de temps si vous l'utilisez simplement. Vous pouvez entrer ici pour apprendre : Docker de l'entrée à la pratique .
1. Mise en place
L'utilisation des commandes Docker ne fait pas de distinction entre les systèmes d'exploitation.La seule chose à noter est que Windows n'a pas sudo
de commandes, et l'autre est de sélectionner un chemin que l'hôte peut reconnaître sur le mappage de volume. En termes d'installation, parmi les systèmes d'exploitation grand public Linux, Mac OS et Windows, Linux a les meilleures performances. Étant donné que Docker peut directement réutiliser le noyau Linux de la machine hôte, vous pouvez installer Docker Engine directement à partir du site Web officiel. Windows et Mac ne peuvent installer que Docker Desktop, qui est visuel. Windows peut être configuré pour utiliser son propre noyau WSL en interne. Il est recommandé de le configurer pour améliorer l'efficacité. Sinon, Docker exécutera un système Linux virtuel localement pour prendre en charge Docker. Dockers Compose est livré avec Mac et Windows, mais il doit être téléchargé et configuré séparément sous Linux.
2. Formulaire de commande
Il existe trois formes de commandes Docker que nous utilisons habituellement, et ces trois formes peuvent être converties entre elles :
-
Ligne de commande
C'est la même chose que de taper d'autres commandes, toutes doivent être tapées manuellement, comme le montre la figure ci-dessous :
Certaines lignes de commande peuvent être très longues, nous pouvons utiliser\
des séparateurs pour les diviser, afin que le visuel puisse être vu plus clairement .
Ce formulaire peut être saisi directement, puis appuyez sur Entrée pour l'exécuter. -
Dockerfile
nécessite un fichier Dockerfile manuscrit au format suivant :FROM anapsix/alpine-java ARG APP_NAME ENV APP_NAME=${APP_NAME} ADD ./flow-eda-${APP_NAME}-0.0.1-SNAPSHOT.jar ./flow-eda-${APP_NAME}.jar ARG APP_PORT EXPOSE ${APP_PORT} ENTRYPOINT java -jar flow-eda-${APP_NAME}.jar
Exécutez
docker build -t ***:1.0 .
pour compiler le fichier dans l'image de la machine, puis exécutez-le. -
DockerCompose
Compose est un outil permettant de définir et d'exécuter des applications Docker multi-conteneurs. Il est plus utile d'écrire l'arrangement des conteneurs requis pour une application. Habituellementdocker-compose.yml
nommé d'après, le format est le suivant :version: '3' services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2-amd64 container_name: "elasticsearch" ports: - 9200:9200 - 9300:9300 environment: - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - cluster.name=tommy-es - bootstrap.memory_lock=true - discovery.type=single-node volumes: - D:/note-data/es-data:/usr/share/elasticsearch/data kibana: image: docker.elastic.co/kibana/kibana:7.9.2 container_name: kibana depends_on: - elasticsearch ports: - 5601:5601
Couramment utilisé dans Docker Compose
docker-compose up -d
pour démarrer en arrière-plan,docker-compose down
fermer le conteneur et supprimer l'image. Il convient de noter que l'image dans DockerCompose ne sera construite que lors de sa première utilisation. Si vous souhaitez effectuer une mise à jour incrémentielle pour les modifications ultérieures, vous devez utiliser la commande suivante :docker-compose build docker-compose up --build
3. Lignes de commande couramment utilisées
3.1、MySQL
# Mysql 8
docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e YSQL_ROOT_HOST:=% mysql
# Mysql 5.7
docker run -p 3307:3306 --name mysql -v /opt/docker/mysql/log:/var/log/mysql -v /opt/docker/mysql/data:/var/lib/mysql -v /opt/docker/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
Si vous souhaitez mapper le fichier de configuration, vous devez créer manuellement le fichier de configuration Mysql à l'avance, /opt/docker/mysql/conf
le fichier de configuration my.cnf
est le suivant :
Mysql 8
[mysqld]
#datadir=/usr/local/mysql/data
default_authentication_plugin=mysql_native_password #使用mysql8以前的密码插件,以便navicat等工具能够正常连接
default-storage-engine=INNODB
character_set_server = utf8
secure_file_priv=/var/lib/mysql
[mysqld_safe]
character_set_server = utf8
[mysql]
default-character-set = utf8
[mysql.server]
default-character-set = utf8
[client]
default-character-set = utf8
MySQL 5.7
[mysqld]
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
Le mappage direct avec le fichier de configuration de la machine hôte peut entraîner des problèmes de sécurité et peut ne pas prendre effet. Si vous y êtes invité, entrez le conteneur et exécutez la commande suivante :
chmod 644 /etc/my.cnf
# 设置编码格式
show variables like 'character_set_%';
set character_set_server=utf8;
3.2、Redis
# 简洁版
docker run -d --name redis -p 6379:6379 redis:latest redis-server --appendonly yes
# 细化配置
docker run -d --privileged=true --restart always --name redis -p 6379:6379 -v /opt/docker/redis/data:/data redis --requirepass 123456 --appendonly yes
3.3、Rabbitmq
docker run -d --privileged=true --restart=always --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 -v /d/Docker/Rabbitmq/data:/var/lib/rabbitmq -v /d/Docker/Rabbitmq/log/:/var/log/rabbitmq/log/ rabbitmq:management
3.4、Nacos
docker run -d --privileged=true --restart=always --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 --env MODE=standalone nacos/nacos-server
docker run -d --privileged=true --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 --env MODE=standalone -v D:\docker\nacos\logs:/home/nacos/logs -v D:\docker\nacos\conf\application.properties:/home/nacos/conf/application.properties nacose:v1
3.5、Nginx
# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /usr/local/docker/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /usr/local/docker/nginx/conf/conf.d
# 删除掉这个用来拿配置文件的容器
docker rm nginx
# 重新开启一个
docker run -d --privileged=true --restart=always -p 9001:80 --name nginx -v /root/web/html:/usr/share/nginx/html -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/docker/nginx/conf/conf.d:/etc/nginx/conf.d -v /usr/local/docker/nginx/log:/var/log/nginx nginx
3.6、Minimum
docker run -p 9090:9090 -p 9091:9091 --name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "[email protected]" \
-v /data/oss/jun/data:/data \
-v /data/oss/jun/config:/root/.minio \
minio/minio server /data --console-address ":9090" --address ":9091"
3.7、Gitlab
sudo docker run --detach --publish 8930:443 --publish 8929:8929 --publish 8928:22 --name gitlab --restart always --volume $GITLAB_HOME/config:/etc/gitlab --volume $GITLAB_HOME/logs:/var/log/gitlab --volume $GITLAB_HOME/data:/var/opt/gitlab --shm-size 256m registry.gitlab.cn/omnibus/gitlab-jh:latest
3.8, Nexus
docker run -d --name nexus3 --restart=always -p 8081:8081 --mount src=nexus-data,target=/nexus-data sonatype/nexus3
3.9、Jenkins
docker run -d -u root -p 8888:8080 -v /opt/docker/jenkins-data:/var/jenkins_home -v /opt/docker.sock:/var/run/docker.sock -v "$HOME":/home --privileged=true --restart=always --name jendemo jenkinsci/blueocean
3.10、Mariadb
docker run -d -p 3306:3309 --name mariadb -v /opt/mariadb/data/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mariadb:latest
mysql -h 127.0.0.1:3309 -u root -p root
3.11、xxl-job
docker run \
-e PARAMS="--spring.datasource.url=jdbc:mysql://172.17.0.3:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai --spring.datasource.username=root --spring.datasource.password=123456" \
-p 28080:8080 \
--name xxl-job-admin \
-d xuxueli/xxl-job-admin:2.3.1
4. DockerFile couramment utilisé
4.1、MySQL
FROM mysql/mysql-server:8.0.30
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY ./glmx.sql /docker-entrypoint-initdb.d
4.2. Application Java
# 环境
FROM glmx-base
RUN mkdir -p /root/glmx
WORKDIR /root/glmx
# 拷贝jar
COPY glmx /root/glmx
# 设置暴露的端口号
EXPOSE 24081
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx1024m -Djava.ext.dirs=lib"
# 执行命令
CMD java -Xms512m -Xmx1024m -Djava.ext.dirs=lib -jar gfpt-gfpt-1.0-SNAPSHOT.jar
4.3, compiler et démarrer
docker build -t demo-app:1.0 .
sudo docker run -d -p 24081:24081 --name demo-app \
--privileged=true --restart always \
-v /home/administrator/demo/app:/root/demo\
demo-app
5. Docker Compose couramment utilisé
5.1. Projet Spring Boot
version: "3.8"
services:
mysql:
build:
context: ./db
container_name: glmx-mysql
ports:
- "6001:3306"
environment:
MYSQL_ROOT_HOST: "%"
MYSQL_ROOT_PASSWORD: 123456
networks:
- glnet
restart: always
privileged: true
redis:
image: glmx-redis
container_name: glmx-redis
ports:
- "6002:6379"
command: ["redis-server","--requirepass 123456","--appendonly yes"]
networks:
- glnet
restart: always
privileged: true
rabbitmq:
image: glmx-rabbitmq
container_name: glmx-rabbitmq
ports:
- 6003:5672
- 6004:15672
networks:
- glnet
restart: always
privileged: true
nacos:
image: glmx-nacos
container_name: nacos-nacos
environment:
- MODE=standalone
ports:
- "6005:8848"
networks:
- glnet
restart: always
privileged: true
nginx:
image: glmx-nginx
container_name: glmx-nginx
ports:
- "80:80"
- "8080:8080"
- "8081:8081"
- "6868:6868"
volumes:
- "D:/Docker/glmx/nginx/conf/default.conf:/etc/nginx/conf.d/default.conf"
- "D:/Docker/glmx/nginx/www:/usr/share/nginx/html"
- "D:/Docker/glmx/nginx/log:/var/log/nginx"
networks:
- glnet
restart: always
privileged: true
app:
image: glmx-app
container_name: glmx-app
ports:
- "24081:24081"
volumes:
- "D:/Docker/glmx/app:/root/glmx"
networks:
- glnet
links:
- mysql
- redis
- rabbitmq
- nacos
depends_on:
- mysql
- redis
- rabbitmq
- nacos
- nginx
restart: always
privileged: true
networks:
glnet:
driver: bridge
6. Des compétences merveilleuses
En cas de non autorisation :
# 没有权限
sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker
afficher le journal
# 查看***容器的日志
docker logs --tail=1000 ***
# 实时查看更新
docker logs -f ***
# 日志保存位置
/var/lib/docker/containers/容器ID/容器ID-json.log
# 避免Ctrl + c 退出此容器
docker attach --sign-proxy=false ***
sauvegarde exportation importation
# 重命名Docker容器的tag名称,***代表现有名字,###代表新名字
docker tag *** ###
# 保存***容器到###.tar中,***容器后面可以跟多个容器
docker save -o ###.tar ***1 ***2
# 恢复容器
docker load --input ***.tar 或者 docker load < ***.tar
Installer Docker Compose
【DockerCompose】
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
- -net=hôte
Uniquement disponible sur Linux, non disponible sur Mac et Windows en raison de problèmes avec l'implémentation réseau de Docker.
- hôte.docker.interne
Cette commande peut représenter l'hôte, mais si le mappage du nom de domaine des hôtes est utilisé dans DockerCompose
extra_hosts:
- "host.docker.internal:host-gateway"
Afficher la configuration liée à Docker
docker inspect {
CONTAINER ID}
docker netowrk inspect {
NETWORK ID}
7. Conclusion
Docker n'est en fait qu'un outil, tout comme une machine virtuelle Vmware, bien que leurs principes soient différents. Mais du point de vue de l'utilisation, il n'y a pas beaucoup de différence, rien de plus que Docker est essentiellement sous la forme de ligne de commande. En raison de la nature rapide et prête à l'emploi de Docker, une fois que vous l'utilisez, vous ne pouvez plus revenir en arrière.