基本命令
# 测试镜像 hello-world
docker pull hello-world
# 从官方仓库下载镜像
docker pull mariadb
# 查看镜像列表
docker images
# 从镜像运行启动容器
docker run redis
docker run hello-world
# 查看容器
docker ps #查看运行的容器
docker ps -a #all,查看全部容器,包括已退出
镜像命令测试
docker tag redis redis:6 # 给镜像添加名称
docker images
docker rmi redis # 从镜像上把名称撕掉
docker images
# 删除所有容器
docker rm -f $(docker ps -aq)
docker rmi redis:6 # 在撕掉最后一个名称时,会从磁盘删除镜像
docker images
# 导出镜像
docker save benwang6/cerebro:0.9.4 rabbitmq:management | gzip > a.gz
# 导入镜像
docker load -i a.gz
容器命令测试
# 启动的容器中默认执行命令
docker history redis
# 启动新的容器时,覆盖CMD默认命令
# 参数i:交互
# 参数t:终端
docker run redis pwd
docker run redis touch f1.txt
docker run redis ls -a -l
docker run redis env
docker run -it redis bash
redis-server
# redis默认使用6379端口,使用6380端口启动redis
docker run redis redis-server --port 6380
# 覆盖 ENTRYPOINT 和 CMD
# 镜像前面覆盖 ENTRYPOINT
# 镜像后面覆盖 CMD
docker run --entrypoint touch redis f1.txt
docker run --entrypoint ls redis -a -l
# -d后台运行
docker run -d redis
docker ps
docker ps -a
# 进入容器,执行容器内的命令
docker exec -it 84d pwd
docker exec -it 84d ls /
docker exec -it 84d bash
# --name 为容器命名
# --restart=always 服务器或docker系统重启后,容器可以自动跟随系统一起重启
docker run -d --name r1 redis
docker run -d --name r2 --restart=always redis
docker ps
# 重启docker系统服务
systemctl restart docker
docker ps # r2随系统一起重启
# 手动启动已经停止的容器
docker restart r1
docker restart 84d
# 清理所有容器
docker rm -f $(docker ps -aq)
# --rm 容器停止时,系统自动删除容器
docker run -d --name r1 redis
docker run -d --name r2 --rm redis
# 停止两个容器,r2停止时会被系统自动删除
docker stop r1 r2 # 等待一段时间(10秒),等待容器内的应用执行关闭过程
docker kill r1 r2 # 不等待,直接关闭
# 查看容器
docker ps -a
# 重启 r1 容器
docker restart r1
# 复制文件到r1容器
docker cp 宿主机文件路径 容器文件路径
docker cp 容器文件路径 宿主机文件路径
docker cp ~/ip-static r1:/root/
# 进入容器查看
docker exec -it r1 ls /root/
# 从容器向宿主机复制文件
docker cp r1:/usr/local/bin/redis-server ~/
ls
# redis容器持久化文件 dump.rdb 存储到宿主机指定目录,避免文件随容器一起被删除
# -v 宿主机路径:容器路径
# 宿主机目录路径会自动创建
docker run -d --name r2 \
-v /opt/r2:/data \
redis
# 在 r2 中添加数据
docker exec -it r2 redis-cli
set a aa
set b bb
set c cc
save # 做数据持久化,数据会存储到 dump.rdb文件
# 回到宿主机查看宿主机上的文件
exit
ls /opt/r2
# 删除r2容器,这时不会删除宿主机的文件 /opt/r2/dump.rdb
docker rm -f r2
# 重新运行启动一个新的容器,把dump.rdb挂载到容器,redis可是使用挂载的文件重新恢复数据
docker run -d --name r2 \
-v /opt/r2:/data \
redis
docker exec -it r2 redis-cli
keys *
# 新建数据卷
docker volume create my-vol
# 查看数据卷
docker volume ls
docker inspect my-vol
# 把my-vol数据卷挂载到容器
docker run -d --name r3 \
-v my-vol:/data \
redis
# 查看容器的挂载详情
docker inspect r3
# 清理
docker rm -f $(docker ps -aq)
# 删除数据卷
docker volume rm my-vol
# 启动mysql,把容器的3306端口映射到宿主机的3306端口
docker run -d --name mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
mariadb
# windows的cmd命令行,连接服务器的mysql容器
mysql -uroot -p -h192.168.xxx.xxx
# 删除容器
docker rm -f mysql
# 用--net host方式,让容器直接使用宿主机端口
docker run -d --name mysql \
--net host \
-e MYSQL_ROOT_PASSWORD=root \
mariadb
# 查看虚拟网络
docker network ls
# 查看默认bridge网络详情:172.17.0.0/16
docker inspect bridge
# 创建自定义的虚拟网络,默认网络参数:172.18.0.0/16
docker network create my-net
docker network ls
docker inspect my-net
# 宿主机上的虚拟网卡,会列在第一个
ifconfig
# 创建容器,连接到网络my-net
# 自动获得的ip是 .2
docker run -d --name r1 \
--net my-net redis
# 自动获得的ip是 .3
docker run -d --name r2 \
--net my-net redis
# 查看容器详情,查看ip地址
docker inspect r1
docker inspect r2
# 测试宿主机、容器之间能否互联互通
ping 172.18.0.2
ping 172.18.0.3
docker exec -it r1 redis-cli -h 172.18.0.3
# 在容器内访问时,使用容器名称连接其他容器,名称可以被自动解析为ip地址
docker exec -it r1 redis-cli -h r2
# 清理
docker rm -f $(docker ps -aq)
docker network rm my-net
构建镜像
构建镜像的过程相当于是一个装机过程
Dockerfile流程配置文件,来配置装机流程
构建一个自己的redis镜像,在其中添加自定义的redis配置文件
编写Dockerfile
# 指定一个基础镜像
# 使用go语言,可以没有底层操作系统,可以FROM scratch
FROM redis
# 把配置文件复制到新构建的镜像中
COPY redis.conf /usr/local/etc/redis/redis.conf
# 设置默认的启动命令,根据自定义配置文件来启东
CMD [ "redis-server", "/usr/local/etc/redis/redis.conf" ]
# 仓库中/笔记/redis 文件夹,上传到服务器的/root/目录
# 执行构建
cd redis
docker build -t my-redis:v1 ./
# 查看容器
docker images
Dockerfile常用指令
- FROM
- COPY - 复制文件
- ADD - 对压缩文件自动解压
- EXPOSE - 设置暴露的端口,该设置不影响更换应用端口,该设置只是帮助用户了解镜像
- ENV - 在容器中添加环境变量
- RUN - 构建过程中会启动临时容器,执行指定的命令