--- title: docker的使用 description: docker的简单使用 published: true date: 2021-12-17T08:47:51.786Z tags: docker editor: markdown dateCreated: 2021-08-02T07:26:50.035Z --- # 容器使用 ## 拉取镜像 ```bash $ docker pull ubuntu ``` ## 启动新容器 ### 交互式启动 ```bash $ docker run -it 镜像 /bin/bash ``` 参数说明: - -i:交互式操作 - -t:终端 - /bin/bash:在镜像后的是命令,这里希望交互式Shell。 ### 后台启动 ```bash $ docker run -itd --name 容器名称 镜像 /bin/bash ``` 参数说明: - -d:默认不会进入容器 ## 查看现有容器 ```bash $ docker ps -a ``` ## 启动已经停止的容器 ```bash $ docker start 容器的ID或名称 ``` ## 停止容器 ```bash $ docker stop 容器ID或名称 ``` ## 重启容器 ```bash $ docker restart 容器ID或名称 ``` ## 进入容器 ### docker attach 进入正在执行的命令行,退出后容器停止 ```bash $ docker attach 容器ID或名称 ``` ### docker exec 打开新的命令行,退出后容器不停止 ```bash docker exec -it 容器ID或名称 bash ``` ## 导出容器 ```bash $ docker export 容器ID或名称 > 导出文件名.tar ``` ## 导入容器 ### 指定文件 ```bash $ cat 要导入的镜像.tar | docker import - 导入后的镜像名称:TAG ``` 或 ```bash $ docker import - 导入后的镜像名称:TAG ``` ### 通过URL导入 ```bash $ docker import http://example.com/exampleimage.tgz example/imagerepo ``` ## 导出镜像 ```bash $ docker save 镜像ID或名称 > 导出名称.tar ``` ## 导入镜像 ```bash $ docker load < 导入名称.tar ``` ## 删除镜像 ```bash $ docker image rm 镜像ID或名称 ``` ```bash $ docker rmi 镜像ID或名称 ``` 批量删除 **\** 镜像 ```bash $ docker rmi $(docker images | grep "none" | awk '{print $3}') ``` ## 删除容器 ```bash $ docker rm -f 容器ID或名称 ``` # mongo ## 运行容器 ```bash $ docker run -p 27017:27017 --name MongoDB -v /root/docker/mongo/db:/data/db -d mongo ``` # redis ## 运行容器 没有密码 ```bash $ docker run \ -e ALLOW_EMPTY_PASSWORD=yes \ -v /path/to/redis-persistence:/bitnami/redis/data \ bitnami/redis:latest ``` 设置密码 ```bash $ docker run --name redis -e REDIS_PASSWORD=666 -p 6379:6379 -d bitnami/redis:6.2.6 ``` # nginx ## 运行容器 ```bash $ docker run --name Nginx1 -p 9091:80 -v /root/docker/nginx/www1:/usr/share/nginx/html -v /root/docker/nginx/conf1:/etc/nginx -d nginx ``` # mysql ## 运行容器 ```bash $ docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 ``` ```bash $ docker run --name MySQL --network service -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/db/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ``` 说明: 1. 将MySQL加入service网络 2. 指定了配置文件卷 3. 指定了数据库卷 4. 指定了ROOT用户密码 5. 指定了utf8mb4字符集(如果用配置文件可省略) ## 脱离my.cnf文件配置 ```bash $ docker run --name mysql57 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ``` # nexus3 ## 创建目录并授权 ```bash $ mkdir /root/docker/nexus/nexus-data && chown -R 200 /root/docker/nexus/nexus-data ``` ## 运行容器 ```bash $ docker run -p 9898:8081 --name Nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms200m -Xmx500m -XX:MaxDirectMemorySize=500m" -v /root/docker/nexus/nexus-data:/nexus-data -d sonatype/nexus3:latest ``` # minio ## 运行容器 ```bash $ docker run --name minio -p 9001:9000 -p 9002:9001 -v /projects/minio/uploadFiles/:/data/ -d minio/minio:latest server /data --console-address ":9001" ``` 说明: 1. 端口 **9000** 为API端口,固定 2. 端口 **9001** 为控制台(网页)端口,通过 **--console-address ":9001"** 指定,不固定 3. 目录 **/data** 为数据文件夹 4. 默认用户名密码在启动后通过 **docker logs minio** 查看 # Zookeeper ## 获取镜像 ```bash $ docker pull bitnami/zookeeper ``` ## 启动容器 ```bash $ docker run -d -p 2181:2181 --name zookeeper-server \ --network app-tier \ -e ALLOW_ANONYMOUS_LOGIN=yes \ bitnami/zookeeper:latest ``` # Kafka ## 获取镜像 ```bash docker pull bitnami/kafka ``` ## 启动容器 如果用network,需要与zookeeper属于同一个network ```bash docker run -d --name kafka --network zk -p 9092:9092 -p 9093:9093 -e ALLOW_PLAINTEXT_LISTENER=yes -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181 -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT -e KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093 -e KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://192.168.0.156:9093 -e KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT bitnami/kafka:latest ``` 参数说明 **KAFKA_CFG_ZOOKEEPER_CONNECT**:zookeeper地址与端口,network时用别名 **ALLOW_PLAINTEXT_LISTENER**:允许使用 PLAINTEXT 监听. 默认: no. **KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP**:CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT **KAFKA_CFG_LISTENERS**: kafka监听,CLIENT://:9092(客户端将监听992),EXTERNAL://:9093(外部监听9093) **KAFKA_CFG_ADVERTISED_LISTENERS**: 公布地址,CLIENT://kafka:9092(容器地址),EXTERNAL://192.168.0.156:9093(外部地址) **KAFKA_CFG_INTER_BROKER_LISTENER_NAME**: 内部监听名称 # 卷与数据持久化 ## 新卷 ```bash $ docker volume create 卷名 ``` ## 查看卷列表 ```bash $ docker volume ls ``` ## 查看卷详情 ```bash $ docker volume inspect 卷名 ``` ## 删除所有未使用的卷 ```bash $ docker volume prune ``` ## 删除一个或多个 ```bash $ docker volume rm 卷名... ``` ## 挂载卷 ```bash $ docker run --name 容器名称 -d -p 8080:80 -v 卷名或者绝对路径:/usr/share/nginx/html/ nginx:v2 ``` ## 挂载配置文件 ```bash $ docker run --name 容器名称 -d -p 8080:80 -v 配置文件:/etc/nginx/nginx.conf nginx:v2 ``` -v 可以有多个配置 挂载配置文件的前提是配置文件需提前存在 # 拷贝 ## 拷贝文件到容器中 ```bash $ docker cp /root/nginx/conf/config/conf 容器名:/etc/nginx/conf ``` ## 从容器中拷贝出文件 ```bash $ docker cp 容器名:/etc/nginx/conf/config.cnf /root/nginx/conf/ ``` # 网络 ## 查看网络 ```bash $ docker network ls ``` ## 创建网络 ```bash $ docker network create 网络名称 ``` ## 容器加入网络 ```bash $ docker run --network 网络名称 --network-alias 容器在网络中的别名(用于通信时直接使用) ``` # 开机启动 ## 参数 1. no: 默认策略,在容器退出时不重启容器 2. on-failure: 在容器非正常退出时(退出状态非0),才会重启容器 3. unless-stopped: 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器 4. always: 在容器退出时总是重启容器 示例: ```bash $ docker run -m 512m --memory-swap 1G -it -p 58080:8080 --restart=always ``` # 更新配置 ```bash docker update [OPTIONS] CONTAINER [CONTAINER...] ```