目录
一、Docker
(一)Docker基础命令
(二)docker镜像命令
(三)docker容器命令
(四)docker运维命令
容器是一种虚拟化技术,容器是镜像实例化对象,就像Java编译后Class构造出的一个个实例对象,本文除了生硬命令大全,还会穿插一些个人对docker的理解。
什么是 Docker? - 知乎
(1)启动docker
systemctl start docker
(2)停止docker
systemctl stop docker
(3)重启docker
systemctl restart docker
(4)随服务启动而自启
systemctl enable docker
(5)查看运行状态
systemctl status docker
(6)查看docker版本号信息
docker info
docker version
使用场景:忘记docker命令参数有哪些
docker --help
docker pull --help
docker push --help
使用场景:查看当前服务器中docker 镜像列表
docker images
使用场景:查找可安装的镜像和版本
docker search 镜像名
docker search chrome
镜像名、描述、关注star数量、是否官方
搜索+筛选条件
例如:筛选stars数量在大于50的镜像
docker search --filter=STARS=50 chrome
使用场景:从docker hub或公司内部镜像hub,下载镜像到本地
docker pull 镜像名称:tag
备注:没有tag默认拉取最新,等同于 docker pull mysql:latest
使用场景:拉取一个mysql镜像,运行镜像容器
docker pull mysql
docker run -it -d --name testmysql -p 8081:8080 mysql:latest
参数说明
参数 | 说明 |
-it | 与容器进行交互式启动 |
-d | 可后台运行容器 |
--name | 给运行的容器自定义命名 |
-p | 端口映射 -p 宿主机端口:容器内端口 |
--restart=always | 自启动容器 |
(1)停止容器
docker stop 容器ID 或 容器名称
(2)启动容器
docker start 容器ID 或 容器名称
(3)重启容器
docker restart 容器ID 或 容器名称
(4)删除容器
docker rm -f 容器ID 或 容器名称
删除容器前,需要先停止容器,运行中的容器无法删除。
docker rmi -f 镜像ID/镜像名称
删除多个镜像
docker rmi -f 镜像ID/镜像名称 镜像ID/镜像名称 镜像ID/镜像名称
强制删除镜像
docker image rm 镜像ID/镜像名称
使用场景:想将本地镜像保存为tar压缩文件,方便用于镜像转移至其他机子上,并 加载这个保存的镜像。
docker save 镜像ID/镜像名称 -o 镜像保存位置路径
例如:保存mysql镜像到当前路径位置,文件名为:mysql-20230314.tar
docker save mysql -o ./mysql-20230314.tar
使用场景:保存的镜像文件,进行加载恢复(解压tar文件)
docker load -i ./mysql-20230314.tar
我们把解压的镜像 run下
docker run mysql-20230314
使用场景:有时候,我们需要对一个已有的镜像进行分类或者版本迭代,相对已有的镜像进行打标签标注版本。
docker tag 源镜像名:原tag 新镜像名:新tag
例如:将mysql最新版,打tag为测试环境1.0.0
docker tag mysql:latest mysql:test-1.0.0
使用场景:
docker ps
docker ps -a
docker run -it -d --name 容器名称 -p 宿主机端口号:容器端口号 镜像名:tag /bin/bash
例如: 拉取mysql镜像,并启动一个mysql 把它取别名为mysql-test 并交互式运行
docker pull mysql:7.5.0
docker run -it -d --name mysql-test -p 8081:8080 mysql:7.5.0 /bin/bash
备注:宿主机 端口有时候可能被占用,需要查看端口占用 情况。
linux
netstat -untlp
mac
lsof -i tcp:8080
杀进程
kill -9 进程号
每个容器都是独立安全应用,并相互隔离,容器与宿主机端口建立绑定关系(容器端口映射),那么访问宿主机的该端口,就可以访问到对应容器。
使用场景:拉取镜像,运行容器,设置容器端口和宿主机端口映射关系。
例如:
启动mysql镜像,容器命名为mysql-test 映射宿主机端口8081和容器端口8080,当 我们访问8081相当于访问到容器mysql-test
docker run -it -d --name mysql-test -p 8081:8080 mysql:latest /bin/bash
容器端口如果被其他容器占用,如何修改?
方式一:进入容器内,修改配置文件
docker exec -it 容器ID/容器名词词 /bin/bash
方式二:进入容器内
docker attach 容器ID/容器名称 /bin/bash
进入容器内部后退出容器内部
exit
(1)启动容器
docker start 容器ID/容器名称
(2)停止容器
docker stop 容器ID/容器名称
(3)重启容器
docker restart 容器ID/容器名称
(4)杀掉容器
docker kill 容器ID/容器名称
使用场景:
容器内部拷出文件
docker cp 容器ID:容器内部路径 容器外部路径
容器外部拷入文件
docker cp 容器外部路径 容器ID:容器内部路径
使用场景:
docker logs -f --tail=日志数量 容器ID/容器名称
docker logs -f --tail=10 ef4ccceb9b6b
docker logs --tail=10 ef4ccceb9b6b
使用场景:以防容器销毁删除,造成数据丢失,将容器内数据挂载到宿主机对应位置
-v 宿主机文件存放位置:容器内文件位置
如此操作,就将容器内指定文件 挂载 宿主机对应位置,-v可多次使用,即一个容器可同时挂载多个文件到宿主机上。
使用场景:容器已启动,不想删除重启容器情况下进行容器重命名。
docker rename 容器ID 新容器名称
使用场景:不想删除容器,又想让容器配置变更。
例如:
修改参数,设置开机启动。
docker update --restart=always 容器ID或容器名称
docker container update --restart=always 容器ID或容器名称
使用场景:在已有镜像基础上,做了一些修改,希望保存封装成一个新的镜像。
docker commit -m=”提交信息“ -a=”作者信息“ 容器ID/容器名称 提交后的新镜像名称:tag
(1)环境变量
在dockerfile中定义系统环境变量名和值,在项目代码中通过获取环境变量函数,来接收参数变量(获取系统环境变量名的值)
FROM python:3.7.4
MAINTAINER jack
ENV webhook_url=https://oapi.dingtalk.com/robot/send?access_token=xxx
ENV secret_token=xxx
ENV check_interval=60
ENV db_username=root
ENV db_password=abc123456
ENV db_host=127.0.0.1
ENV db_port=3306
ENV db_name=tonghuashun
COPY . /tonghuashun
workdir /tonghuashun
run pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
cmd ["python","main.py"]
run和cmd区别:
触发时机不同
RUN 在构建镜像时 即docker build
CMD 在运行容器时(打完镜像后运行容器时)即docker run
import os
EN_DB_USERNAME=os.getenv("db_username")
EN_DB_PASSWORD=os.getenv("db_password")
EN_DB_HOST=os.getenv("db_host")
EN_DB_PORT=os.getenv("db_port")
EN_DB_NAME=os.getenv("db_name")
process.env.NODE_ENV //获取对应环境变量的值
package main
import ( "fmt" "os")
func main() {
name := os.Getenv("NAME")
fmt.Println("name is:", name)}
(2)docker run时传入环境变量参数
docker run -p 9000:9000 -e environment=dev -e cluster=0 -d me/app
(3)其他
FROM nginx:1.20.0
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist/ /usr/share/nginx/html/
COPY replace.sh /
RUN chmod 777 /replace.sh
CMD ["/replace.sh"]
COPY 当前dockerfile目录 的文件名 nginx.conf、文件夹dist、文件replace.sh 复制到容器指定目录中。
RUN 在docker build时运行 (打镜像时)
CMD 在docker run时运行(运行容器时)
docker-compose.yml 文件分为三个主要部分:services、networks、volumes
参数说明
参数 | 说明 |
version | 版本 |
build | 使用当前目录下的Dockerfile进行构 |
image | 指定运行容器使用的镜像 |
container_name |
默认运行出来的容器名称 |
command | 覆盖容器启动后默认执行的命令Dockerfile定义的CMD 注意:当Dockerfile定义了entrypoint的时候,docker-comose.yml定义的command会被覆盖 |
enrtypoint | 执行命令行,可以覆盖Dockerfile中定义的entrypoint命令 |
links | 链接到其它服务中的容器。 使用服务名称(同时作为别名)或服务名称:服务别名 (SERVICE:ALIAS) 格式都可以 例如: version: '3' services: order-service links: - user-service - pay-service - redis |
external_links |
链接到 docker-compose.yml 外部的容器,参数格式跟 links 类似。 |
prot | 暴露容器端口信息 |
expose | 指定内部端口,但不映射到宿主机,只被连接的服务访问。 |
enviroment | 定义的变量会覆盖.env文件中定义的重名环境变量。 |
ports |
将容器的端口80映射到宿主机的端口8080 |
volumes | 设置容器的数据卷路径 |
networks | 容器使用的网络设置。 |
depends_on |
基于云镜像
基于本地dockerfile
version: '3'
services:
web:
build:
context: ./
dockerfile: mydockerfile
完整示例:
version: '3.8'
networks:
test_network:
external: true
services:
myapidemo:
image: 1312958948/myapidemo:1.1
container_name: myapidemo
build: .
restart: always
ports:
- "9020:5000"
volumes:
- /root/apilogs/logs:/app/logs
networks:
- test_network
nginxapi:
image: nginx
container_name: nginxapi
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /root/nginx/www:/usr/share/nginx/html
- /root/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
- /root/nginx/logs:/var/log/nginx
- /root/nginx/certs:/etc/nginx/certs
networks:
- test_network
mysql:
image: mysql:8.0
container_name: mysql
restart: always
ports:
- "3306:3306"
volumes:
- /var/lib/docker/volumes/mysqldata/_data:/var/lib/mysql39
environment:
MYSQL_ROOT_PASSWORD: Aa123456
MYSQL_DATABASE: MyTest
TZ: Asia/Shanghai
networks:
- test_network
redistest:
image: redis
container_name: redistest
restart: always
ports:
- "6379:6379"
command: redis-server --requirepass 123456
networks:
- test_network
sudo docker info | grep ”Docker Root Dir“
du -hs /var/lib/docker
docker system df
(1)删除异常停止的容器
docker rm `docker ps -a | grep. Exited | awk '{print $1}'`
find / -type f -size +100M -print0 | xargs -0 du -h |sort -nr
例如:
这边查查查找到事‘/var/lib/docker/overlay2/*’开头且文件大小大于100MB的文件
find / -type f -size +100M -print0 | xargs -0 du -h |sort -nr | grep ‘/var/lib/docker/overlay2/*’