一.docker的使用
1.docker的简介
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
一个完整的Docker有以下几个部分组成:
- DockerClient客户端
- Docker Daemon守护进程
- Docker Image镜像
- DockerContainer容器 [2]
2.docker的下载
curl -fsSL https://get.docker.com |bash -s docker --mirror Aliyun
3.docker更换下载源
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-"EOF"
{
"registry-mirrors": ["https://gxeo3yz7.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
4.查看docker的相关配置
查看镜像
sudo docker images 或者 sudo docker images ls
sudo docker images -a 查看所有的镜像
查看可以拉取哪一些镜像
sudo docker search 镜像名
5.拉取镜像
docker pull 镜像名
卸载镜像
docker rmi 镜像名
6.创建mysql 容器
docker pull mysql:5.7 拉取镜像
docker run -d --name mysql-5.7-3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD='xiao.123' mysql:5.7 创建容器
-d 是后台运行
--name 容器名称
-p 使用的端口,3307 是外部能访问的,3306是容器的端口
-e 指定环境变量 设置密码
-v (使用docker数据卷)
docker exec -it mysql-5.7-3307 bash 进入到容器内部
--network
进入mysql mysql -uroot -p密码
授权其他机器登录mysql
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xiao.123' WITH GRANT OPTION;
更新权限
FLUSH PRIVILEGES;
删除容器
docker rm 容器名或者容器id
7.创建redis容器
1.docker pull redis 拉取镜像
2. 从本地的redis配置中复制redis.conf文件 到/usr/local/redis目录下(redis目录要创建)
3. 接着把redis.conf通过数据卷,添加到容器里面
docker run -d --name redis-6380 -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data -p 6380:6379 redis
4.docker ps -a 查看创建的容器是否运行,如果运行,则进入到容器内部
docker exec -it redis-6380 bash 查看redis.conf 是否存在
如果存在,则测试远程
8 把本地的文件 移到容器里面
1.创建一个a.py文件
2. 把文件移到容器里面 :docker cp 本地文件 容器名:/绝对路径
docker cp a.py redis-6380:/data
(容器文件到本地上诉位置互换即可)
3.进入容器,查看是否存在
9.docker查看日志
docker logs 容器名称/ID
docker logs -f(查看实时日志) -t(查看日志产生的日期)--since="2018-12-1" --tail=10 qfjy-exam(容器名称)
二.dockerfile文件的使用
使用 Dockerfile 定制镜像 - Docker — 从入门到实践 (gitbook.io)
FROM:指定基础镜像。
FROM ubuntu:latest
MAINTAINER:指定维护者信息。
MAINTAINER yourname@example.com
RUN:在构建镜像过程中执行命令。
RUN apt-get update && apt-get install -y nginx
CMD:指定容器启动时默认执行的命令。
CMD ["echo", "Hello, World!"]
ENTRYPOINT:指定容器启动时的入口命令,与 CMD 配合使用。
ENTRYPOINT ["python", "app.py"]
COPY:将本地文件复制到容器中。
COPY ./app /app
ADD:将本地文件添加到容器中的指定目录,支持自动解压缩。
ADD app.tar.gz /app/
ENV:设置环境变量。
ENV MY_VAR=my_value
ARG:定义构建参数,可以在运行时替换。
ARG MY_ARG=default_value
LABEL:为镜像添加元数据标签。
LABEL maintainer="yourname@example.com"
VOLUME:指定容器中的持久化存储卷。
VOLUME /data
EXPOSE:声明容器提供服务的端口。
EXPOSE 80
WORKDIR:设置工作目录。
WORKDIR /app
USER:切换用户。
USER www-data
HEALTHCHECK:定义健康检查指令。
HEALTHCHECK --interval=30s --timeout=3s \n CMD curl -f http://localhost/ || exit 1
STOPSIGNAL:设置容器停止信号。
STOPSIGNAL SIGTERM
CHMOD、CHOWN、SETGID、SETUID:设置文件权限和所有权。
RUN chmod +x /app/script.sh
RUN chown root:root /app/script.sh
RUN setgid 1000
RUN setuid 1000
SHELL:指定容器内使用的 shell。
SHELL ["/bin/bash", "-c"]
案例
在本地创建一个django项目 然后创建requirements.txt
Django==4.2.6
django_redis==5.4.0
djangorestframework==3.14.0
djangorestframework_simplejwt==5.3.0
PyMySQL==1.1.0
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件复制到容器的/app目录下
COPY . /app
# 安装项目依赖
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
# 暴露端口
EXPOSE 8000
# 运行Django开发服务器
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
三. docker-compose的使用
安装docker-compose: pip install docker-compose
version:指定 Docker Compose 文件格式的版本。
yaml
复制代码
version: '3'
services:定义一组服务,每个服务包含一个容器实例。
services:
web:
image: nginx:latest
ports:
- "80:80"
build:构建镜像时使用的上下文路径。
services:
web:
build: ./webapp
image:指定容器使用的镜像名称或 ID。
services:
web:
image: my_web_image:1.0
container_name:指定容器的名称。
services:
web:
image: nginx:latest
container_name: my_web_container
ports:映射容器端口到主机端口。
services:
web:
image: nginx:latest
ports:
- "8080:80"
volumes:挂载主机目录到容器中。
services:
web:
image: nginx:latest
volumes:
- ./data:/var/www/html
environment:设置环境变量。
services:
web:
image: nginx:latest
environment:
- MY_ENV_VAR=my_value
command:覆盖容器启动时的默认命令。
services:
web:
image: nginx:latest
command: ["nginx", "-g", "daemon off;"]
depends_on:定义服务之间的依赖关系。
services:
web:
image: nginx:latest
depends_on:
- db
db:
image: postgres:latest
networks:将服务连接到指定的网络。
networks:
my_network:
driver: bridge
services:
web:
image: nginx:latest
networks:
- my_network
secrets:从主机传递加密的敏感数据到容器中。
yaml
复制代码
version: '3'
services:
web:
image: my_web_image:1.0
secrets:
- my_secret_key
configs:从主机传递配置文件到容器中。
version: '3'
services:
web:
image: my_web_image:1.0
configs:
- my_config_file
restart:定义容器在退出时是否自动重启策略。
version: '3'
services:
web:
image: nginx:latest
restart: always
logging:配置日志驱动和日志相关选项。
复制代码
version: '3'
services:
web:
image: nginx:latest
logging:
driver: syslog
options:
syslog-address: tcp://localhost:514
tag: my_web_app
healthcheck:定义健康检查指令和选项。
version: '3'
services:
web:
image: nginx:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/"]
interval: 30s
timeout: 5s
retries: 3
案例:docker-compose.yml 创建两个mysql容器
version: "3"
services:
mysql01:
image: mysql:5.7
container_name: mysql0
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: node
MYSQL_USER: node
MYSQL_PASSWORD: 123456
mysql02:
image: mysql:5.7
container_name: mysql02
ports:
- 3308:3306
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: node
MYSQL_USER: node
MYSQL_PASSWORD: 123456