docker学习笔记
docker学习笔记
一、安装
1.1、卸载旧版本
如果系统之前安装过Docker,需要先卸载,避免冲突 。
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
1.2、安装依赖工具
安装yum-utils(提供yum-config-manager工具)和Docker所需的存储驱动 。
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
1.3、添加Docker官方仓库
添加Docker的官方软件源,以便安装最新版本的Docker Engine 。
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
小提示:如果你在国内,拉取镜像可能会慢。可以考虑将上面的官方源地址替换为阿里云镜像源地址 http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 来加速后续的安装
1.4、安装Docker引擎
安装Docker的核心组件:docker-ce(引擎)、docker-ce-cli(命令行工具)和containerd.io(容器运行时)。
sudo yum install -y docker-ce docker-ce-cli containerd.io
1.5、启动Docker并设置开机自启
安装完成后,启动Docker服务,并设置为开机自动启动 。
sudo systemctl start docker
sudo systemctl enable docker
1.6、验证安装结果
运行一个测试容器来验证Docker是否安装成功。如果看到欢迎信息,就说明一切正常 。
sudo docker run hello-world
注意:如果执行报错
Unable to find image ‘hello-world:latest’ locally docker: Error response from daemon: Get “https://registry-1.docker.io/v2/”: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
原因:国内网络问题,官方库不同,将镜像地址改为国内即可
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn"
]
}
EOF
重新加载配置并重启
sudo systemctl daemon-reload
sudo systemctl restart docker
检测生效:
sudo docker info | grep -A 1 "Registry Mirrors"
如果显示刚配置的地址,说明成功
再次执行
docker run hello-world
二、Hellow word
2.1、在容器里运行一个应用程序
docker run ubuntu:15.10 /bin/echo "Hello world"
各个参数解析:
docker: Docker 的二进制执行文件。
run: 与前面的 docker 组合来运行一个容器。
ubuntu:15.10 指定要运行的镜像,Docker 首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo “Hello world”: 在启动的容器里执行的命令
2.2、运行交互式容器
docker run -i -t ubuntu:15.10 /bin/bash
-t: 在新容器内指定一个伪终端或终端。
-i: 允许你对容器内的标准输入 (STDIN) 进行交互。
2.3、退出容器
Exit
2.4、停止容器
docker stop 容器id(通过docker ps查询)
三、容器
3.1、客户端指令
命令 功能 示例
docker run 启动一个新的容器并运行命令 docker run -d ubuntu
docker ps 列出当前正在运行的容器 docker ps
docker ps -a 列出所有容器(包括已停止的容器) docker ps -a
docker build 使用 Dockerfile 构建镜像 docker build -t my-image .
docker images 列出本地存储的所有镜像 docker images
docker pull 从 Docker 仓库拉取镜像 docker pull ubuntu
docker push 将镜像推送到 Docker 仓库 docker push my-image
docker exec 在运行的容器中执行命令 docker exec -it container_name bash
docker stop 停止一个或多个容器 docker stop container_name
docker start 启动已停止的容器 docker start container_name
docker restart 重启一个容器 docker restart container_name
docker rm 删除一个或多个容器 docker rm container_name
docker rmi 删除一个或多个镜像 docker rmi my-image
docker logs 查看容器的日志 docker logs container_name
docker inspect 获取容器或镜像的详细信息 docker inspect container_name
docker exec -it 进入容器的交互式终端 docker exec -it container_name /bin/bash
docker network ls 列出所有 Docker 网络 docker network ls
docker volume ls 列出所有 Docker 卷 docker volume ls
docker-compose up 启动多容器应用(从 docker-compose.yml 文件) docker-compose up
docker-compose down 停止并删除由 docker-compose 启动的容器、网络等 docker-compose down
docker info 显示 Docker 系统的详细信息 docker info
docker version 显示 Docker 客户端和守护进程的版本信息 docker version
docker stats 显示容器的实时资源使用情况 docker stats
docker login 登录 Docker 仓库 docker login
docker logout 登出 Docker 仓库 docker logout
docker top 查看容器内部运行的进程
常用选项说明:
-d:后台运行容器,例如 docker run -d ubuntu。
-it:以交互式终端运行容器,例如 docker exec -it container_name bash。
-t:为镜像指定标签,例如 docker build -t my-image .。
–name:容器命名。
-P:是容器内部端口随机映射到主机的端口。
-p:是容器内部端口绑定到指定的主机端口。
3.2、进入容器
在使用 -d 参数时启动容器时,容器会运行在后台,这时如果要进入容器,可以通过以下命令进入:
docker attach:允许你与容器的标准输入(stdin)、输出(stdout)和标准错误(stderr)进行交互。(退出时,容器会停止)
docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止
3.3、参数说明
-d:后台运行容器,例如 docker run -d ubuntu。
-it:以交互式终端运行容器,例如 docker exec -it container_name bash。
-t:为镜像指定标签,例如 docker build -t my-image .。
3.4、导入导出容器
导出容器ubuntu:
docker export 1e560fca3906 > ubuntu.tar
导入容器快照:
cat docker/ubuntu.tar | docker import - test/ubuntu:v1
从指定url导入容器:
docker import http://example.com/exampleimage.tgz example/imagerepo
-P:主机与容器端口映射
默认将容器内部使用的网络端口随机映射到我们使用的主机上。
映射指定端口:
docker run -d -p 5000:5000 training/webapp python app.py
结构:主机端口:容器端口
3.5、删除容器
docker rm -f 1e560fca3906
3.6、清理停止的容器
清理掉所有处于终止状态的容器
docker container prune
3.7、容器打包成镜像
基本语法
docker commit [选项] 容器ID或容器名 新镜像名:标签
示例:将容器ID为 ‘a1b2c3d4’ 的容器保存为新镜像 ‘my-nginx:latest’
同时添加提交信息 ‘-m’ 和作者 ‘-a’
docker commit -m "安装了vim并修改了默认页面" -a "你的名字" a1b2c3d4 my-nginx:latest
-m: 提交信息,类似Git的commit信息,方便日后追溯。
-a: 指定作者。
-p: 提交时暂停容器运行,确保文件系统一致性,默认是true。
验证镜像
docker images
导出
四、镜像
4.1、镜像列表
docker images
各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签,同一个镜像可以有多个tag,代表不同版本,运行时:镜像:tag
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
运行镜像容器
docker run -t -i ubuntu:15.10 /bin/bash
-i: 交互式操作。
-t: 终端。
ubuntu:15.10: 这是指用 ubuntu 15.10 版本镜像为基础来启动容器。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
4.2、搜索镜像
docker search httpd
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。
AUTOMATED: 自动构建。
4.3、删除镜像
docker rmi hello-world
4.4、创建、更新镜像
1、从已经创建的容器中更新镜像,并且提交这个镜像
2、使用 Dockerfile 指令来创建一个新的镜像
更新镜像
4.4.1、通过镜像创建容器
docker run -t -i ubuntu:15.10 /bin/bash
4.4.2、进入容器,更新
apt-get update
apt-get upgrade -y
操作完后退出
exit
4.4.3、提交容器
docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名
4.4.4、查看构建更新的镜像
docker images
4.4.5、启动容器
docker run -t -i runoob/ubuntu:v2 /bin/bash
4.5、构建镜像
4.5.1、创建Dockerfile文件
4.5.1.1、旧版Dockerfile示例
Dockerfile脚本
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
4.5.1.2、解释
基础配置
FROM centos:6.7
使用CentOS 6.7作为基础镜像
MAINTAINER Fisher “fisher@sudops.com”
指定作者信息(旧版Docker语法,现在推荐使用LABEL指令)
用户管理
RUN /bin/echo ‘root:123456’ | chpasswd
设置root用户的密码为"123456"
chpasswd命令从标准输入读取"用户名:密码"格式来修改密码
RUN useradd runoob
创建一个名为"runoob"的新用户
RUN /bin/echo ‘runoob:123456’ | chpasswd
设置runoob用户的密码也为"123456"
系统配置
RUN /bin/echo -e "LANG=“en_US.UTF-8"” >/etc/default/local
设置系统的默认语言环境为英文UTF-8编码
注意:CentOS通常使用/etc/locale.conf而不是/etc/default/local
端口暴露
EXPOSE 22
声明容器运行时监听的SSH端口
EXPOSE 80
声明容器运行时监听的HTTP端口
启动命令
CMD /usr/sbin/sshd -D
容器启动时运行SSH守护进程
-D参数表示以前台模式运行(防止容器立即退出)
构建镜像
docker build -t runoob/centos:6.7 .
解释:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
设置镜像标签
docker tag 860c279d2fec runoob/centos:dev
4.5.1.3、升级后Dockerfile示例
Dockerfile
# 使用更新的基础镜像
FROM centos:7.9.2009
# 使用LABEL替代MAINTAINER
LABEL maintainer="Fisher <fisher@sudops.com>" \
version="1.0" \
description="Updated SSH-enabled CentOS image"
# 设置环境变量
ENV LANG=en_US.UTF-8 \
LANGUAGE=en_US:en \
LC_ALL=en_US.UTF-8 \
TZ=Asia/Shanghai
# 更新系统并安装必要软件
RUN yum update -y && \
yum install -y \
openssh-server \
openssh-clients \
sudo \
vim \
curl \
wget \
net-tools \
&& yum clean all \
&& rm -rf /var/cache/yum/*
# 配置SSH
RUN ssh-keygen -A && \
sed -i 's/#PermitRootLogin yes/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config && \
sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
# 创建用户并设置权限(使用更安全的方式)
ARG ROOT_PASSWORD=${ROOT_PASSWORD:-root123}
ARG USER_PASSWORD=${USER_PASSWORD:-user123}
RUN useradd -m -s /bin/bash -G wheel runoob && \
echo "root:${ROOT_PASSWORD}" | chpasswd && \
echo "runoob:${USER_PASSWORD}" | chpasswd
# 配置sudo权限
RUN echo '%wheel ALL=(ALL) ALL' >> /etc/sudoers && \
echo 'runoob ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers.d/runoob && \
chmod 440 /etc/sudoers.d/runoob
# 创建SSH目录并设置权限
RUN mkdir -p /home/runoob/.ssh && \
chmod 700 /home/runoob/.ssh && \
chown -R runoob:runoob /home/runoob/.ssh
# 复制SSH公钥(可选,用于免密登录)
# COPY authorized_keys /home/runoob/.ssh/authorized_keys
# RUN chmod 600 /home/runoob/.ssh/authorized_keys && \
# chown runoob:runoob /home/runoob/.ssh/authorized_keys
# 暴露端口
EXPOSE 22
# 创建启动脚本
RUN echo '#!/bin/bash\n\
/usr/sbin/sshd -D\n\
' > /entrypoint.sh && chmod +x /entrypoint.sh
# 设置健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD pgrep sshd || exit 1
# 启动SSH服务
CMD ["/entrypoint.sh"]
配套的docker-compose.yml(推荐使用)
version: '3.8'
services:
ssh-server:
build:
context: .
args:
ROOT_PASSWORD: ${ROOT_PASSWORD:-root123456}
USER_PASSWORD: ${USER_PASSWORD:-user123456}
image: ssh-centos:latest
container_name: centos-ssh
restart: unless-stopped
ports:
- "2222:22" # 映射到主机的2222端口
volumes:
- ssh-data:/home/runoob/.ssh
- ./data:/data # 数据持久化
environment:
- TZ=Asia/Shanghai
networks:
- ssh-network
volumes:
ssh-data:
driver: local
networks:
ssh-network:
driver: bridge
使用方法:
构建镜像
docker build -t ssh-centos .
或者使用docker-compose
docker-compose up -d
连接SSH
ssh runoob@localhost -p 2222
传递自定义密码
docker-compose build --build-arg ROOT_PASSWORD=myrootpass --build-arg USER_PASSWORD=myuserpass
五、容器连接
5.1、映射端口
docker run -d -p 5000:5000 training/webapp python app.py
-P 随机映射,-p指定端口
绑定IP
docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py
标识指定通过本地访问,主要用来做来源限制,除此还有:
0.0.0.0:8080:8080,监听所有接口
5.2、docker容器互连
5.2.1、创建一个网络
docker network create -d bridge test-net
参数说明:
-d:参数指定 Docker 网络类型,有 bridge、overlay
查看创建:
Docker network ls
5.2.2、连接网络
容器1加入:
docker run -itd --name test1 --network test-net ubuntu /bin/bash
容器2加入:
docker run -itd --name test2 --network test-net ubuntu /bin/bash
5.2.3、配置 DNS
避免网络转发延迟、提升可移植性、扩展性、安全行、解决复杂度等
在主机上添加配置文件/etc/docker/daemon.json
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
重启docker
查看配置
docker run -it --rm ubuntu cat etc/resolv.conf
如果只想在指定的容器设置 DNS,则可以使用以下命令:
docker run -it --rm -h host_ubuntu --dns=114.114.114.114 --dns-search=test.com ubuntu
参数说明:
–rm:容器退出时自动清理容器内部的文件系统。
-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。
–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。
如果在容器启动时没有指定 --dns 和 --dns-search,Docker 会默认用宿主主机上的 /etc/resolv.conf 来配置容器的 DNS。
六、Dockerfile
Dockerfile 指令 说明
FROM 指定基础镜像,用于后续的指令构建。
MAINTAINER 指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL 添加镜像的元数据,使用键值对的形式。
RUN 在构建过程中在镜像中执行命令,同shell。(每个run指令都会新建一层,可以用&&连接多个run)
CMD 指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT 设置容器创建时的主要命令。(不可被覆盖)
EXPOSE 声明容器运行时监听的特定网络端口。
ENV 在容器内部设置环境变量。
ADD 将文件、目录或远程URL复制到镜像中。
COPY 将文件或目录复制到镜像中。
VOLUME 为容器创建挂载点或声明卷。
WORKDIR 设置后续指令的工作目录。
USER 指定后续指令的用户上下文。
ARG 定义在构建过程中传递给构建器的变量,可使用 “docker build” 命令设置。
ONBUILD 当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL 设置发送给容器以退出的系统调用信号。
HEALTHCHECK 定义周期性检查容器健康状态的命令。
SHELL 覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
更多推荐


所有评论(0)