镜像中心
在线体验 docker labs.play-with-docker.com/
镜像加速器
可以通过修改daemon配置文件 /etc/docker/daemon.json 来使用加速器
阿里云加速器地址
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["可以是阿里云镜像加速地址,或其它厂商体统的加速地址"]
}
EOF
systemctl daemon-reload
systemctl restart docker
安装
安装所需的软件包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置稳定的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装最新版本的 Docker Engine-Community 和 containerd
yum -y install docker-ce docker-ce-cli containerd.io
或者使用脚本安装
curl -sSL https://get.daocloud.io/docker | sh
或者
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动
systemctl start docker
基本命令
镜像操作
列出本地镜像
docker images
列出镜像, 包含中间镜像层
docker images -a
列出镜像只显示镜像ID
docker images -q
列出镜像, 含中间镜像层只显示镜像ID
docker images -qa
显示镜像摘要信息
docker images --digests
显示镜像完整信息
docker images --no-trunc
显示指定镜像的历史创建; 参数-H 镜像大小和日期, 默认为true
--no-trunc 显示完整的提交记录
-q 仅列出提交记录ID
docker history -H redis
镜像搜索
这里搜索mysql镜像为例子
docker search mysql
--filter=stars=600 只显示stars>=600的镜像
docker search --filter=stars=600 mysql
--no-trunc显示镜像完整 DESCRIPTION 描述
docker search --no-trunc mysql
--automated 只列出AUTOMATED=OK 的镜像
docker search --automated mysql
镜像下载
下载redis官方最新镜像, 相当于 docker pull redis:latest
docker pull redis
下载仓库所有redis镜像
docker pull -a redis
下载私人仓库镜像
docker pull 仓库用户名/redis
镜像删除
单个镜像删除, 相当于 docker rmi redis:latest
docker rmi redis
强制删除(比如删除正在运行的容器进程)
docker rmi -f redis
多个镜像删除, 以空格间隔开
docker rmi -f redis mysql nginx
删除本地全部镜像
docker rmi -f $(docker images -q)
容器操作
容器操作可使用容器ID(CONTAINER ID)或容器名称(NAMES)
容器启动
新建并启动容器
参数
-i 以交互模式运行容器
-t 为容器重新分配一个伪终端
-d 已守护方式启动容器
--name 为容器指定一个名称
docker run -i -t --name mycentos
docker run -it --name mycentos
后台启动容器
docker run -d mycentos
启动一个或多个已被停止的容器
docker start redis
重启容器
docker restart redis
容器进程 列出redis容器中运行的进程
docker top redis
容器日志 查看redis容器日志, 默认参数
docker logs redis
查看redis容器日志
参数
-f 跟踪日志输出
-t 显示时间戳
--tail 仅列出最新N条容器日志
docker logs -f -t --tail=20 redis
查看容器redis从2019年05月21日后最新10条日志
docker logs --since="2019-05-21" --tail=10 redis
容器的进入与退出
使用run方式在创建时进入
docker run -it centos /bin/bash
容器关闭并退出
exit
仅退出容器, 不关闭
ctrl + P + Q
直接进入centos容器启动命令的终端, 不会启动新进程,
多个attach连接共享容器屏幕
参数
--sig-proxy=false 确保ctrl+D或ctrl-c不会关闭容器
docker attach --sig-proxy=false centos
在centos容器中打开新的交互模式终端, 可以启动新进程
参数
-i 即使没有附加也保持STDIN打开
-t 分配一个伪终端
docker exec -i -t centos /bin/bash
以交互模式在容器中执行命令, 结果返回到当前终端屏幕
docker exec -i -t centos ls -l /tmp
以分离模式在容器中执行命令, 程序后台运行, 结果不会反馈到当前终端
docker exec -d centos touch cache.txt
查看容器
查看正在运行的容器
docker ps
查看正在运行的容器ID
docker ps -q
查看正在运行+历史运行过的容器
docker ps -a
显示运行容器总文件大小
docker ps -s
显示最近创建的容器
docker ps -l
显示最近创建的3个容器
docker ps -n 3
不截断输出
docker ps --no-trunc
获取镜像redis的元信息
docker inspect redis
获取正在运行的容器redis的IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' redis
容器的停止与删除
停止一个运行中的容器
docker stop redis
杀掉一个运行中的容器
docker kill redis
删除一个已停止的容器
docker rm redis
删除一个运行中的容器
docker rm -f redis
删除多个容器
docker rm -f $(docker ps -a -q)
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm
-l 移除容器间的网络连接, 裂解名为db
docker rm -l db
-v 删除容器, 并删除容器挂载的数据卷
docker rm -v redis
生成镜像
基于当前redis容器创建一个新的镜像
参数
-a 提交的镜像作者
-c 使用Dockerfile指令来创建镜像
-m 提交时的说明文字
-p 在commit时将容器暂停
docker commit -a="Develop1024" -m="my redis" [容器ID] myredis:v1.1
容器与主机间的数据拷贝
将redis容器中的文件copy至本地路径
docker cp redis:/容器路径 本地路径
将主机文件copy到redis容器
docker cp 本地路径 redis:/容器路径
将主机文件copy至redis容器, 目录重命名为容器路径
docker cp 本地路径 redis:/容器路径
数据卷,目录映射
创建数据卷
docker volume create 数据卷名称
# /var/lib/docker/volumes/
查看数据卷信息
docker volume inspect 数据卷名称
[root@localhost tomcat]# docker volume inspect tomcat
[
{
"CreatedAt": "2020-10-15T03:20:45-04:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/tomcat/_data",
"Name": "tomcat",
"Options": {},
"Scope": "local"
}
]
查看全部数据卷
[root@localhost tomcat]# docker volume ls
DRIVER VOLUME NAME
local tomcat
删除数据卷
docker volume rm 数据卷名称
映射数据卷
如果数据卷不存在, docker会帮你自动创建(会将容器内部的文件映射出来)
docker run -v 数据卷名称:容器内部路径 镜像id
直接指定一个位置作为数据卷的存放位置(不会将容器内部的文件映射出来,里面是空的)
docker run -v 路径:容器内部路径 镜像id
基于容器挂载数据卷
docker create --name webpage -v C:\Users\Administrator\Desktop\test:/usr/local/tomcat/webapps tomcat /bin/true
docker run -p 8001:8080 --volumes-from webpage --name tomcat1 -d tomcat
docker run -p 8002:8080 --volumes-from webpage --name tomcat1 -d tomcat
docker run -p 8003:8080 --volumes-from webpage --name tomcat1 -d tomcat
容器网络
容器基于Link实现单向通信
docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD=111111 mysql:5.6
# 之后后在mytomcat中可 ping 通 mysql01
docker run -d --name mytomcat --link mysql01 tomcat
# 进入容器内
docker exec -it mytomcat /bin/bash
# 可以使用 `mysql01` 与 mysql01通信
ping mysql01
利用Brige网桥实现双向通信
显示所有可用的网络服务
docker network ls
NETWORK ID NAME DRIVER SCOPE
acec17691e27 bridge bridge local
4f39480f4300 host host local
3173a5917187 none null local
创建网桥
docker network create -d bridge my-bridge
创建两个容器实现互相通信
docker run -d --name mysql02 -e MYSQL_ROOT_PASSWORD=111111 mysql:5.6
docker run -d --name mytomcat2 tomcat
docker network connect my-bridge mysql02
docker network connect my-bridge mytomcat2
# 进入 mytomcat2中
docker exec -it mytomcat2 /bin/bash
# 尝试与 mysql02通信
ping mysql02
# 进入mysql02中也可与mytomcat2通信
docker exec -it mysql02 /bin/bash
ping mytomcat2
Dockerfile
FROM - 基于基准镜像
FROM scratch # 不依赖任何基准镜像
FROM tomcat:9.0.22-jdk8-openjdk
FROM centos:latest
LABEL - 说明信息
LABEL maintainer = "wanghaha"
LABEL version = "1.0"
LABEL description = "xxx镜像"
WORKDIR - 设置工作目录
# 目录不存在则自动创建
WORKDIR /usr/local/xxx
ADD & COPY
ADD hello / # 复制到跟路径
ADD demo.tar.gz /tmp # 复制到/tmp问价夹并解压
# ADD 除了复制还具备添加远程文件的功能
COPY a.sh /tmp # 复制文件a.sh到/tmp中
COPY demo.tar.gz /tmp # 复制demo.tar.gz到/tmp中不会解压
ENV - 设置环境常量
ENV JAVA_HOME /usr/local/openjdk8
# 在后面可以使用这些常量
RUN ${JAVA_HOME}/bin/java -jar test.jar
EXPOSE - 暴露容器端口
将内部端口暴露给宿主机
EXPOSE 8080
RUN & CMD & ENTRYPOINT
RUN : 在build构建时执行的命令
RUN yum install vim # shell 命令格式
RUN ["yum","install","-y","vim"] # exec命令格式
ENTRYPOINT :容器启动时执行的命令
ENTRYPOINT(入口点)用于在容器启动时执行命令
Dockerfile中只有最后一个ENTRYPOINT会被执行
ENTRYPOINT ["ps"] # 贵贱使用exec格式
CMD :容器启动后执行默认的命令或参数
Dockerfile中出现多个CMD,则只有最后一个被执行
如容器启动时附加指令,则CMD被忽略
CMD ["ps","-ef"] # 推荐使用exec格式
执行的时间点不同
docker build 创建镜像会执行 RUN 修改镜像内部的文件
docker run 创建容器会执行CMD , ENTRYPOINT 修改容器内部文件
构建
docker build -t name:tag [dir/.]
Dockerfile安装nginx
FROM hub.c.163.com/public/centos:latest
RUN rpm --rebuilddb && yum -y install gcc zlib zlib-devel pcre pcre-devel tar wget
ADD nginx-1.16.1.tar.gz .
WORKDIR nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx && make && make install
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
单机容器部署工具 - Docker-Compose
部署wordpress
docker-compose.yml
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
运行
-d 表示后台运行
docker-compose up -d
查看运行状况
docker-compose ps
查看日志
docker-compose logs <服务名>
docker-compose logs db
重新构建镜像
docker-compose build
停止并删除容器、网络、图像和卷
docker-compose down