- Docker官网
一、安装Docker
1、查看 Linux 内核版本
- Centos7 要求linux内核至少3.8以上
uname -a
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PcQpmp5u-1663484747883)(./image/Linux内核版本.png)]
2、更新 yum 包
yum update
3、安装需要的软件包,yum-util 提供 yum-config.manager 功能,另为两个是 device-mapper 驱动的依赖(可选)
yum -y install gcc
yum -y install gcc-c++
yum install -y yum-utils dervice-mapper-persistent-data lvm2
4、设置 docker yum 源(可选)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、查看仓库中 docker 版本,可以指定安装,不指定安装最新版本(可选)
yum list docker-ce --showduplicates | sort -r
6、安装docker
yum makecache fast
sudo yum install docker-ce #安装最新版
7、启动docker,加入开机启动,验证安装
systemctl status docker #查看docker状态
systemctl start docker #启动docker
systemctl enable docker # Linux 开机启动
docker version
8、测试
docker pull hello-world # 拉取 hello-world 镜像
docker images # 查看已有镜像
docker run hello-world # 运行 hello-world 镜像
9、卸载docker
yum list installed | grep docker # 查看已经安装的docker
yum -y remove docker-ce.x86_64 # 卸载指定docker
10、创建docker用户组
Docker守候进程绑定的是一个unix
socket,而不是TCP端口。这个套接字默认的属主是root,其他是用户可以使用sudo命令来访问这个套接字文件。因为这个原因,docker服务进程都是以root帐号的身份运行的。避免每次运行docker命令的时候都需要输入sudo
- 1、使用有sudo权限的账号登录服务器
- 2、查看用户组有没有docker组
sudo cat /etc/group | grep docker
- 3、创建docker分组,将相应用户添加到这个分组里面
sudo groupadd docker
sudo usermod -aG docker 用户
- 4、检查创建是否有效
cat /etc/group
- 5、退出当前用户登录状态,然后重新登录让权限生效,或者重启docker
sudo systemctl restart docker
- 6、直接运行docker命令,执行docker命令
docker info
- 如果提示get …dial unix /var/run/docker.sock权限不够,则修改/var/run/docker.sock权限
sudo chmod a+w /var/run/docker.sock
二、Docker 中央仓库
1、官网(速度慢)
https://hub.docker.com/
2、国内镜像
- 网易蜂巢
http://c.163.com/hub
- daoCloud(推荐)
http://hub.daocloud.io/
3、搭建私服
- 1、修改/etc/docker/daemon.json文件,若文件不存在,则手动创建
添加如下内容:
{
"registry-mirrors": ["https://docker-cn.com"],
"insecure-registries": ["ip:port"] //替换响应的IP和端口即可
}
- 2、重启服务
systemctl daemon-reload
systemctl restart docker
三、Docker 镜像操作
1、拉取镜像到本地
# 查询镜像版本
docker search 镜像名称
# 拉取指定镜像
docker pull 镜像名称[:tag]
# docker pull daoclould.io/library/tomcat:8.5.15-jre8
2、查看全部本地的镜像
docker images
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3YhyQ4J5-1663484747884)(./image/docker镜像.png)]
REPOSITORY 镜像名称
TAG 镜像版本
IMAGE ID 镜像ID
3、删除镜像
docker rmi 镜像的标识
4、镜像的导入导出(不规范)
- 将本地镜像到出
docker save -o 导出路径 镜像id
- 加载本地的镜像文件
docker load -i 镜像文件
5、修改镜像名称
docker tag 镜像id 新镜像名称:版本
四、Docker容器操作
1、运行容器(通过镜像文件创建一个容器)
- 简单操作
docker run 镜像的标识镜像名称[:tag]
- 常用参数
# 创建容器
docker create -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识/镜像名称[:tag]
# 启动容器
docker start 容器名称/容器id
# 创建并运行
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像的标识/镜像名称[:tag]
- -d 代表后台运行容器
- -p 宿主机端口:容器端口 为了映射当前Linux的端口和容器的端口
- –name 容器名称
2、查看正在运行的容器
docker ps [-qa]
- -a 查看全部的容器,包括没有运行的
- -q 只查看容器的标识
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vsp2sAsi-1663484747885)(./image/docker运行中的容器.png)]
CONTAINER ID 容器id
3、查看容乃公器的日志
docker logs -f 容器id
- -f 可以滚动查看日志的最后几行
4、进入到容器内部
# 进入到容器内部
docker exec -it 容器id bash
# 从容器内部退出
exit
5、删除容器(删除前,需要先停止容器)
# 拷贝文件到指定容器的指定目录中
docker cp 源文件 容器:/url容器路径
# 拷贝容器的指定文件到宿主机
docker cp 容器:/url容器路径 宿主机路径
6、删除容器(删除前,需要先停止容器)
# 停止指定容器
docker stop 容器id
# 停止全部容器
docker stop $(docker ps -qa)
# 删除指定容器
docker rm 容器id
# 删除全部容器
docker rm $(docker ps -qa)
# 启动容器
docker start 容器id
五、Docker应用
使用 MySQL 容器
1、拉取 MySQL 镜像
docker pull daocloud.io/library/mysql:8.0.1
2、查看镜像
docker images
3、创建 MySQL 容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql 镜像[:tag]
- -e MYSQL_ROOT_PASSWORD=root 设置root用户的密码是123456
使用 Tomcat 容器
1、拉取 Tomcat 镜像
docker pull daocloud.io/library/tomcat:8.0.45
2、查看镜像
docker images
3、创建 Tomcat 容器
docker run -d -p 8080:8080 --name tomcat 镜像[:tag]
使用 Nginx 容器
1、通过Docker安装Nginx如何配置nginx.conf
通过数据卷,宿主机的配置文件覆盖容器内文件
六、Docker数据卷
部署docker工程,需要使用 docker cp 的命令将宿主机内文件复制到容器内部
数据卷:将宿主机的一个目录,映射到容器的一个目录中,可以在宿主机中操作目录中的内容,容器内部映射文件,也会跟着改变
1、创建数据卷
docker volume create 数据卷名称
# 创建数据卷之后,默认会存放在一个目录下 /var/lib/docker/volume/数据卷名称/_data
2、查看数据卷的详细信息
docker volume inspect 数据卷名称
3、查看全部数据卷
docker volume ls
4、删除数据卷
docker volume rm 数据卷名称
5、应用数据卷
- 当映射数据卷,如果数据卷不存在,Docker 会自动创建,会将内部自带的文件,存储在默认的存放路径中
# 先创建数据卷,在进行挂载
docker run -v 数据卷:容器内部的路径 镜像id
# 直接指定一个路径作为数据卷的存放位置,这个路径下是空的
docker run -v 路径:容器内部的路径 镜像id
七、Docker 自定义镜像
Dockerfile
Dockerfile 一个包含用于组合镜像的命令文本档,docker 通过读取 Dockerfile 中的指令自动生成镜像
docker build 命令用于从 Dockerfile 构建镜像
docker build --no-cache -t -f /path/to/a/dockerfile .
- -f 指向文件系统中 Dockerfile 文件
- –no-cache 不缓存RUN指令的创建的中间镜像
- -t 不缓存RUN指令的创建的中间镜像
1、Dockerfile 的基本结构
- 1、基础镜像信息
- 2、维护者信息
- 3、镜像操作指令
- 4、容器启动时执行指令
2、Dockerfile 文件说明
Docker 以从上到下的顺序运行 Dockerfile 的指令,#
开头是注释
1、FROM :指定基础镜像,必须是第一个命令
# 格式
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
# 示例 FROM mysql:5.6
tag 或者 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像
2、MAINTAINER : 维护者信息
# 格式 MAINTAINER <name>
# 示例 MAINTAINER 张三 email:....@qq.com
3、RUN : 构建镜像时执行的命令
# 命令执行方式一:shell执行
# 格式 RUN <command>
# 示例 RUN apk update
# 命令执行方式二:exec执行
# 格式 RUN ["executable","param1","param2"]
# 示例 RUN ["/etc/execfile","arg1","arg2"]
RUN指令创建的中间镜像会被缓存,并且在下次构建中使用。如果不想使用这些缓存可以在构建时指定 --no-cache 参数
4、ADD : 将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似 wget
# 格式
ADD <src>... <dest>
ADD ["<src>",... <dest>] # 用于支持包含空格的路径
# 示例 ADD home* /mydie/ # 添加所有以 home 开头的文件
# 示例 ADD hom?.txt /mydie/ # ? 替代一个字符,例如:"home.txt"
# 示例 ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
# 示例 ADD test /absolutDir/ # 添加 "test" 到 /absolutDir/
5、COPY : 功能类似 ADD ,但是不会自动解压文件,也不能访问网络
6、CMD : 构建容器后调用,就是在容器启动时才进行调用
# 格式
CMD ["executable","param1","param2"] # 执行可执行文件,优先
CMD ["param1","param2"] # 设置了 ENTRYPOINT,则直接调用 ENTRYPOINT 添加参数
CMD command param1 param2 # 执行 shell 内部命令
# 示例 CMD echo "This is a test." | wc -
# 示例 CMD ["/usr/bin/wc","--help"]
CMD 不同于RUN ,CMD 用于指定在容器启动时所要执行的命令,而 RUN 用于指定镜像构建时所要执行的命令
7、ENTRYPOINT: 配置容器,使其可执行,配合 CMD 可省去 “application” ,只是用参数
# 格式
ENTRYPOINT ["executable","param1","param2"] # 执行可执行文件,优先
ENTRYPOINT command param1 param2 # 执行 shell 内部命令
# 示例
FROM ubuntu
ENTRYPOINT ["top","-b"]
CMD ["-c"]
ENTRYPOINT 与 CMD 非常类似,不同的是通过 docker run 执行的命令不会覆盖 ENTRYPOINT , 而 docker run 命令中指定的任何参数,都会被当做参数再次传递给 ENTRYPOINT 。Dockerfile 中只允许有一个 ENTRYPOINT 指令,多指定是会覆盖前面的设置,而只执行最后的 ENTRYPOINT 指令
8、LABEL: 用于为镜像添加元数据
# 格式 LABEL <key>=<value> <key>=<value> <key>=<value> ...
# 示例 LABEL version="1.0" description="这是一个web服务器" by="ghz"
使用 LABEL 指定的元数据时,一条 LABEL 可以指定多条元数据,多个之间用空格分割。推荐将所有的元数据通过一条 LABEL 指令指定,以免生成过多的中间镜像
9、ENV: 设置环境变量
# 格式
ENV <key> <value> # <key>之后的所有内容均会被视为其<value>的组成,一次只能设置一个变量
ENV <key>=<value> ... # 可以设置多个变量,每个变量用<key>=<value>的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标识;另外,反斜线也可以用于续行
# 示例
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
10、EXPOSE: 指定和外界交互的端口
# 格式 EXPOSE <port> ...
# 示例 EXPOSE 80 443
# 示例 EXPOSE 8080
# 示例 EXPOSE 11211/tcp 11211/udp
EXPOSE 并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或者通过-p参数来发布EXPOSE导出的所有端口
11、VOLUME: 用于指定持久化目录
# 格式 VOLUME ["/path/to/dir"]
# 示例 VOLUME ["/data"]
# 示例 VOLUME ["/var/www","/var/log/apache2"]
一个卷可以存在一个或多个容器的指定目录,该目录可以绕过联合文件系统
并具有以下功能:• 1、卷可以容器间共享和重用
• 2、容器并不一定要和其他容器共享卷
• 3、修改卷后会立即生效
• 4、对卷的修改不会对镜像产生影响
• 5、卷会一直存在,直到没有任何容器在使用它
12、WORKDIR: 工作目录;类似于cd命令
# 格式 WORKDIR /path/to/workdir
# 示例
WORKDIR /a # 这时的工作目录为/a
WORKDIR b # 这时的工作目录为/a/b
WORKDIR c # 这时的工作目录为/a/b/c
通过 WORKDIR 设置的工作目录后,Dockerfile 中其后的 RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。在使用 docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录
13、USER: 指定运行时容器的用户名或者ID,后续的RUN也会使用指定用户。使用USER指定用户时,可以使用用户名,UID或者GID,或者两者的结合。当服务不需要管理员权限时,可以通过该命令指定运行用户,并且可以在之前创建所需的用户
# 格式
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
# 示例 USER www
使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。镜像构建完成后,通过 docker run 运行容器时,可以通过-u参数来覆盖所指定的用户
14、ARG: 用于指定传递给构建运行时的变量
# 格式 ARG <name>[=<default value>]
# 示例 ARG site
# 示例 ARG build_user=www
15、ONBUILD: 用于设置镜像触发器
# 格式 ONBUILD [INSTRUCTION]
# 示例 ONBUILD ADD ./app/src
# 示例 ONBUILD RUN /usr/local/bin/python-build --dir /app/src
当所构建的镜像被用做其他镜像的基础镜像,该镜像中的触发器才会被触发
Docker 自定义镜像demo
- nginx Dockerfile(从基础镜像构建)
# 基础镜像 centos
FROM centos
# 维护者
MAINTAINER 张三
# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
# ADD 文件放在当前目录下,拷过去会自动解压
# nginx
ADD nginx-1.8.0.tar.gz /usr/local/
# 企业linux扩展包
ADD epel-release-latest-7.noarch.rpm /usr/local/
# RUN 执行命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www
# WORKDIR
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-prce && make && make install
RUN echo "daemon off:" >> /etc/nginx.conf
# 端口
EXPOSE 80
# 容器启动运行命令
CMD ["nginx"]
- tomcat Dockerfile(依赖已有镜像)
FROM daocloud.io/library/tomcat:8.5.15-jre8
# copy war包到容器中
COPY demo.war /usr/local/tomcat/webapps
- 构建镜像
# . 代表当前 dockerfile 所在路径,就是当前目录
docker build -t 镜像名称:版本 .
八、Docker Compose(批量管理容器)
1、下载安装
- 1、下载网址
https://github.com/docker/compose/releases
# Linux 直接下载
wget https://github.com/docker/compose/releases/download/v2.11.0/docker-compose-linux-x86_64
- 2、配置环境变量
# 修改名字
mv docker-compose-linux-x86_64 docker-compose
# 添加执行权限
sudo chmod +x docker-compose
# 移动到/usr/local/bin下
mv docker-compose /usr/local/bin
# 修改/etc/profile文件,给/usr/local/bin配置到PATH中
vim /etc/profile
# 给PATH变量追加变量/usr/local/bin,多个之间:分割
export PATH=/usr/local/bin:$PATH
# 使环境变量生效
source /etc/profile
# 测试安装结果
docker-compose --version
2、Docker-compose.yml 文件编写
# docker-compose 版本,docker版本19.03.0以上的要用 3.8
# https://docs.docker.com/compose/compose-file/compose-file-v3/ 这个网址查看 docker版本 与 docker-compose版本 对应关系
version:'3.8'
# 配置服务
service:
# 服务名称:mysql
mysql:
# 代表docker启动,那么这个容器就跟着一起启动
restart: always
# 指定镜像
image: daocloud.io/library/mysql:8.0.1
# 指定容器名称
container_name: mysql
# 指定端口
ports:
- 3306:3306
# 启动容器的环境参数
environment:
# 指定mysql root用户登录密码
MYSQL_ROOT_PASSWORD: 123456
# 指定时区
TZ: Asia/Shanghai
# 映射数据卷(宿主机的路径得存在)
volumes:
- /home/home/docker-compose/mysql_data:/var/lib/mysql
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.0.45
container_name: tomcat
ports:
- 8080:8080
environment:
TZ: Asia/Shanghai
volumes:
- /home/home/docker-compose/tomcat/webapps:/usr/local/tomcat/webapps
- /home/home/docker-compose/tomcat/logs:/usr/local/tomcat/logs
3、docker-compose 命令管理容器
- 1、基于docker-compose.yml启动管理到的容器
# 读取当前目录下的 docker-compose.yml 文件
docker-compose up -d
- 2、关闭并删除容器
# 停止管理的所有容器,并删除
docker-compose down
- 3、开启关闭重启已经存在的由docker-compose维护的容器
docker-compose start
docker-compose stop
docker-compose restart
- 4、查看由docker-compose管理的容器
docker-compose ps
- 5、查看日志
docker-compose logs -f
4、docker-compose结合Dockerfile使用
version:'3.8'
server:
web-demo:
restart: always
# 构建自定义镜像
build:
# 指定Dockerfile文件所在路径
context: ../
# 指定Dockerfile文件名称
dockerfile: Dockerfile
image: demo:1.0
container_name: demo
ports:
8081:8080
environment:
TZ: Asia/Shanghai