Docker学习记录
Docker学习记录
笙沉Linux下安装Docker
环境:CentOS7
参考文档:Docker安装文档
1、卸载原有的docker
1 | sudo yum remove docker \ |
2、设置yum仓库地址
1 | sudo yum install -y yum-utils |
3、安装Docker
1 | sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
4、启动Docker
1 | # 设置开机自启 |
Docker version 24.0.6, build ed223bc
5、测试Docker
1 | sudo docker run hello-world |
看到输出结果中包含:Hello from Docker!,则代表测试成功!
6、阿里云镜像加速
进入阿里云搜索:容器镜像服务ACR>镜像工具>镜像加速器
然后按照文档配置即可
1 | sudo mkdir -p /etc/docker |
Docker命令
搜索镜像:docker search 镜像名
1 | [root@localhost ~]# docker search mysql |
使用命令搜索展示效果不太好,因此更推荐去Docker hub网站上搜索
下载镜像:docker pull 镜像名[:标签]
若没有指定标签,docker默认下载最新版本镜像
1 | # 下载Mysql 8.0.34的镜像 |
列出所有镜像:docker images [选项]
1 | [root@localhost ~]# docker images |
REPOSITORY:镜像名称
TAG:镜像标签
IMAGE ID:镜像ID(唯一标识)
CREATED:镜像创建时间
SIZE:镜像大小
列出所有的镜像ID
1 | [root@localhost ~]# docker images -q |
查看名为mysql的镜像
1 | [root@localhost ~]# docker images -a --filter=reference=mysql |
列出正在运行的容器信息:docker ps [选项]
1 | [root@localhost ~]# docker ps |
CONTAINER ID:容器的ID
IMAGE:镜像
COMMAND:启动时的命令
CREATED:状态
STATUS:运行状态
PORTS:端口信息
NAMES:镜像自动为容器创建的名字,也唯一代表一个容器
列出所有容器,无论是否运行:docker ps -a
列出所有退出状态的容器信息:docker ps -f status=exited
列出所有退出状态的容器ID:docker ps -f status=exited -q
创建并运行容器:docker run [OPTIONS] IMAGE [COMMAND][ARG...]
OPTIONS:选项,需要重点关注 -d、-p、-v、-e、–restart这几个选项
IMAGE:镜像信息,推荐使用 镜像名:TAG的写法,只写镜像名,默认是latest镜像
COMMAND:创建容器后要执行的命令
ARG…:COMMAND命令的参数
运行方式:
- 后台运行:
docker run -d nginx:latest
- 交互式运行:
docker run -it nginx:latest bash
- 默认运行方式:
docker run nginx:latest
run命令详解:
1、-p选项:端口对外发布:docker run -d -p 宿主机端口:容器内端口 镜像名
1 | [root@localhost ~]# docker run -d -p 8888:80 nginx |
此时可以访问宿主机的8888端口,即可访问到容器内的80端口
2、-v选项:数据卷:docker run -v 宿主机目录:容器目录[:读写权限] 镜像名
读写权限默认是:rw(read-write)可读写,还可以指定为:ro(read-only)只读
-v参数的作用:有时候需要将容器的数据持久化保存,例如MySQL容器,数据会保存在容器内的MySQL对应的文件夹下,若将容器删除,那么之前保存的数据也都会被直接删除,因此我们需要将宿主机的文件挂载到容器内,这样当容器被删除时,宿主机上的数据还是存在的。
将宿主机的/home/nginx/html挂载至容器内的/usr/share/nginx/html:
1 | [root@localhost ~]# docker run -d -p 8888:80 -v /home/nginx/html:/usr/share/nginx/html nginx |
此外,我们还可以使用别名来设置数据卷:docker run -v 数据卷别名:容器目录[:读写权限] 镜像名
这种方式docker会自动帮助我们创建数据卷
1 | [root@localhost ~]# docker run -d -v nginx_volume:/usr/share/nginx/html nginx |
列出所有数据卷:docker volume ls
1 | [root@localhost ~]# docker volume ls |
查看数据卷详情:docker volume inspect 数据卷名
1 | [root@localhost ~]# docker volume inspect nginx_volume |
此外,我们还可以手动创建数据卷:docker volume create 数据卷名
1 | [root@localhost ~]# docker volume create my_volume |
删除数据卷:docker volume rm 数据卷名
1 | [root@localhost ~]# docker volume rm my_volume |
3、-e选项:设置环境变量
运行mysql:8.0.34并设置root密码123456
1 | [root@localhost ~]# docker run -d -p 3306:3306 -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.34 |
4、–name选项:容器命名
将容器命名为myNginx
1 | [root@localhost ~]# docker run -d --name myNginx nginx |
5、–restart选项:容器退出后重启策略
- no(默认):容器退出不自动重启
- always:容器总是在退出后自动重启
- no-failure[:max-retries]:容器仅在非正常退出时重启,可指定最大重试次数
- unless-stopped:容器会在退出后自动重启,除非手动停止了容器
1 | [root@localhost ~]# docker run -d --restart always nginx |
删除容器:docker rm [选项] [容器名或ID...]
容器名或ID可以有多个,用空格分开
1 | [root@localhost ~]# docker rm c69b6855a137 |
强制删除正在运行的容器:docker rm -f 容器ID或容器名
删除所有的容器:docker rm -f $(docker ps -aq)
$()
是Linux中常用的一种命令替换语法,它可以将()中的命令的输出结果作为字符串使用
例如当前所在目录为/home,那么ls $(pwd)
等价于ls /home
删除所有非运行状态的容器:docker rm $(docker ps -f status=exited -q)
进入容器执行命令:docker exec [选项] 容器名或ID 命令 [参数...]
1 | [root@localhost ~]# docker exec df23d0096e17 pwd |
交互式不退出执行命令:docker exec -it 容器名或ID bash
1 | [root@localhost ~]# docker exec -it df23d0096e17 bash |
查看容器日志:docker logs [选项] 容器名或ID
1 | [root@localhost ~]# docker logs df23d0096e17 |
持续显示最新的日志:docker logs -f 容器名或ID
显示最近5行日志:docker logs -n 5 容器名或ID
容器文件拷贝:
将宿主机文件拷贝至容器:docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
1 | [root@localhost ~]# docker cp /home/1.txt df23d0096e17:/home/1.txt |
将容器文件拷贝至宿主机:docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
1 | [root@localhost ~]# docker cp df23d0096e17:/home/1.txt /home/2.txt |
停止正在运行的容器:docker stop [选项] [容器名或ID...]
1 | [root@localhost ~]# docker stop df23d0096e17 |
运行停止的容器:docker start [选项] 容器名或ID
1 | [root@localhost ~]# docker start df23d0096e17 |
查看镜像详细信息:docker image inspect [OPTIONS] 镜像名称...
查看容器详细信息:docker inspect [OPTIONS] 容器名称或Id...
查看容器内进程:docker top 容器名或ID
1 | [root@localhost ~]# docker top 24ec743ca690 |
Docker网络
创建网络:docker network create 网络名
1 | [root@localhost ~]# docker network create my_network_a |
列出所有网络信息:docker network ls
1 | [root@localhost ~]# docker network ls |
加入网络:
- 创建容器时:
docker run --network 网络名 镜像名
- 创建容器后加入:
docker network connect [选项] 网络名 容器名或ID
查看网络详情:docker network inspect 网络名或ID
删除网络:docker network rm 网络名或ID
DockerFile
入门案例:
1、创建文件:touch HelloWorld
2、编写指令:
1 | FROM centos:7 |
3、编译镜像:docker build -t hello:1.0 -f HelloWorld .
-t :定义镜像名称和标签
-f :指定DockerFile文件
. :表示在当前目录下查找DockerFile来构建
4、运行镜像:docker run hello:1.0
1 | [root@localhost ~]# docker run hello:1.0 |
常用命令的作用:
FROM:用来定义基础镜像,作用在构建镜像时
CMD:用于定义容器运行时的默认命令,可以在使用docker run的时候覆盖掉CMD中定义的命令,作用在容器运行时
除了
CMD ["echo", "helloworld"]
这种写法,还可以写成:CMD echo $HOME
,这种形式可以解析环境变量;第三种写法:CMD ["sh", "-c", "echo $HOME"]
一个DOckerFile写多个CMD命令的时候,只有最后一个会起作用。
ENV:定义环境变量
编写dockerfile,定义一个名为CONTENT的环境变量,默认值helloworld,运行容器可指定变量值
1
2
3FROM centos:7
ENV CONTENT="helloworld"
CMD echo $CONTENTdocker build -t test:01 -f HelloWorld .
1
2[root@localhost ~]# docker run -e CONTENT=Hello_JAVA test:01
Hello_JAVAWORKDIR:设置当前的工作目录,如果该目录不存在,则会自动创建
类似于Linux的mkdir+cd的组合。
1
2
3FROM centos:7
WORKDIR /a/b/c
CMD pwddocker build -t test:03 -f HelloWorld .
1
2[root@localhost ~]# docker run test:03
/a/b/c并且WORKDIR可以使用环境变量:
1
2
3
4ENV DIR="/aa/bb"
WORKDIR $DIR
# ===等价于===
WORKDIR /aa/bbRUN:在构建过程中执行指定的命令(区别于CMD,CMD是在镜像运行时执行指定命令)
需求:定义一个CONTENT环境变量,默认为helloWorld,在镜像/app目录下创建一个myDir目录,并在其中创建content.txt文件,文件内容为CONTENT变量的值,容器启动打印content.txt的内容
1
2
3
4
5FROM centos:7
ENV CONTENT="helloWorld"
WORKDIR /app/myDir
RUN echo $CONTENT > content.txt
CMD ["cat", "content.txt"]docker build -t test:04 -f HelloWorld .
1
2[root@localhost ~]# docker run test:04
helloWorldADD:将构建上下文中的文件或网络文件添加到镜像中,而且如果文件为压缩包,会自动解压,注意:网络文件并不会自动解压
将dockerfile所在目录的文件夹myProject中的内容添加到容器内的/app文件夹,并且复制到nginx的html目录并启动
1
2
3
4
5FROM nginx:1.21.5
WORKDIR /app
ADD myProject .
RUN cp -r * /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]EXPOSE:声明暴露的容器端口,多个用空格分隔
1
2
3
4
5
6FROM nginx:1.21.5
WORKDIR /app
ADD myProject .
RUN cp -r * /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]