Docker学习笔记

Docker常用命令

系统命令

# 显示版本信息
docker version   	
# 显示系统信息,比version更加详细
docker info			
# 帮助命令
docker CLI --help	

镜像命令

# 查看本地镜像
docker images
-a		显示所有
-f		过滤
-q		只显示ID
# 搜索仓库中的镜像
docker search
-f		过滤
# 拉取镜像
docker pull NAME[:TAG]
-a		显示所有
-f		过滤
-q		只显示ID
# 删除镜像
docker rmi IMAGEID
-f		强制删除
docker rmi -f $(docker images -aq)


# 查看镜像的详细信息
docker inspect IMAGEID
-f		显示格式
-s		大小[只对容器有效]
# inspect返回的是JSON格式消息,可以用-f参数来指定其中的某一项内容
docker inspect IMAGEID -f {{.RepoTags}}
# 也可以通过grep进行过滤
docker inspect IMAGEID  | grep IPAddress


# 创建Docker镜像 共三种方法
# 第一种 基于已有容器创建
docker commmit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a		作者信息
-m		提交信息
-p		提交时暂停容器的运行
# 第二种 基于本地模板导入


# 上传镜像到仓库
docker push NAME[:TAG]

# 保存镜像
docker save
# 载入镜像
docker load

# 查看镜像的构建历史
docker history IMAGEID

容器命令

# 运行容器
docker run    等效于先执行docker create再执行docker start
--name		命名
-d			后台运行
-it			使用交互方式运行,进入容器查看内容   exit:退出并停止  ctrl+P+Q:只退出不停止
			-t让docker分配一个伪终端并绑定到容器的标准输入上
			-i让容器的标准输入保持打开
-p			指定端口号(主机端口:docker端口)
-P			随机指定端口

# 列出容器
docker ps
-a			包括历史运行过的容器
-n=?		显示最近创建的几个容器
-q			只显示容器的编号
#删除容器
docker rm CONTIONERID 				# 只能删除处于终止状态的容器,带-f参数可以删除所有状态容器
docker rm -f $(docker ps -aq) 
docker ps -aq | xargs docker rm		# 与上边的命令等效

# 创建、启动、停止、重启、强制停止
docker create 				该命令创建的容器处于停止状态,需要用docker start命令来启动它
docker start CONTIONERID
docker stop CONTIONERID
docker restart CONTIONERID
docker kill CONTIONERID

# 导出和导入容器
docker export
docker import

# 进入docker
docker attach		所有attach到同一个容器的窗口是同步显示的,一个窗口因命令阻塞时,其他命令也会阻塞
docker exec			自1.3版本起提供的相对于attach更方便的工具

数据管理

数据卷

数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器时间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 卷会一直存在,知道没有容器使用

数据卷的使用类似于Linux下对目录或文件进行mount操作

在使用docker run时,使用参数-v可以在容器内创建一个数据卷,多次使用-v参数可以创建多个数据卷

# 示例 给redis容器指定redis.conf和data  :前边对应宿主机,:后边对应docker  
# 本地目录路径必须是绝对路径,如果本地不存在该路径,docker会自动创建
# docker挂载数据卷的默认权限是rw,用户也可以通过-ro指定为只读
docker run -p 8001:6379 --name redis -v /usr/local/bin/docker/redis.conf:/etc/redis/redis.conf -v /usr/local/bin/docker/data:/data -d redis:5.0.5 redis-server /etc/redis/redis.conf --appendonly yes

数据容器

如果用户要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

数据卷容器就是一个普通容器,专门为它提供数据卷供其他容器挂载使用方法如下:

# 创建数据容器
docker run -it -v /dbdata --name dbdata ubuntu         /dbdata指的是docker中的路径
# 在其他容器上使用--volumes-from挂载数据容器中的数据卷
docker run -it --volumes-from dbdata --name ubuntu1 ubuntu
docker run -it --volumes-from dbdata --name ubuntu2 ubuntu

网络配置

容器与宿主机之间的端口映射

docker run -p/-P

docker port 

容器之间的互联

--link

DockerFile

DockerFile是用来构建Docker镜像的文件,就是一个命令参数脚本

构建步骤:

  1. 编写DockerFile文件
  2. 通过docker build -f dockerfilename构建镜像
  3. docker run运行镜像
  4. docker push发布镜像

DockerFile举例:

FROM centos

VOLUME ["volume1", "volume2"]

CMD echo "---end---"

CMD /bin/bash

DockerFile指令

FROM			指定基础镜像
MAINTAINER		维护者信息
RUN				镜像构建时需要执行的命令
ADD				添加其他镜像
WORKDIR			工作目录
VOLUME			数据卷
EXPOSE			对外暴露的端口
CMD				指定容器启动时运行的命令,只有最后一个会生效,且可以被替代
ENTRYPOINT		同CMD,但是可以追加命令
ONBUILD			当构建一个被继承的DockerFile时就会执行ONBUILD的指令
COPY			类似ADD命令
ENV				设置构建时的环境变量

实战举例

基于Docker安装redis-cluster

# 安装docker
yum install docker
systemctl start docker

# 下载redis5.0.5镜像
docker pull redis:5.0.5

# 编写实现文件
cd /home
mkdir redis-cluster
cd redis-cluster
vim redis-cluster.tmpl

# 填入以下内容
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
# 这里填写宿主机IP,阿里云用公网IP时集群创建会失败,内网IP没问题
cluster-announce-ip x.x.x.x
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
requirepass test@123

# 构建redis网络
docker network create redis-net
docker network ls

# 执行上面的tmpl文件,传入参数 8000 - 8005 作为redis不同单节点的端口
for port in `seq 8000 8005`; do 
mkdir -p ./${port}/conf 
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf 
&& mkdir -p ./${port}/data; 
done

# 授权 文件夹 权限
chmod 777 8000 8001 8002 8003 8004 8005

# 启动docker redis镜像  将会启动 8000 8001 8002 8003 8004 8005五个节点的redis
for port in `seq 8000 8005`; do 
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} 
--privileged=true 
-v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf 
-v /home/redis-cluster/${port}/data:/data 
--restart always --name redis-${port} --net redis-net 
--sysctl net.core.somaxconn=1024 redis:5.0.5 redis-server /usr/local/etc/redis/redis.conf; 
done

# 查看 IP 及 端口 (docker内网)
for port in `seq 8000 8005`; do 
echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "redis-net").IPAddress }}' "redis-${port}")":${port}"  "  ; 
done
# 回显
172.18.0.2:8000  172.18.0.3:8001  172.18.0.4:8002  172.18.0.5:8003  172.18.0.6:8004  172.18.0.7:8005 

#进入redis-8000容器
docker exec -it redis-8000 bash
# 设置三主三从
redis-cli -a test@123 --cluster create 172.18.0.2:8000 172.18.0.3:8001 172.18.0.4:8002 172.18.0.5:8003 172.18.0.6:8004 172.18.0.7:8005 --cluster-replicas 1
#遇到提示输入 yes

# 遇到等待join需要新开一个ss窗口执行以下命令如果成功了,就不用了
#分别进入 其他redis容器 加入 8000 的集群中
docker exec -it redis-8001 bash
redis-cli -a test@123 -p 8001 cluster meet 172.18.0.2 8000
exit
 
docker exec -it redis-8002 bash
redis-cli -a test@123 -p 8002 cluster meet 172.18.0.2 8000
exit

docker exec -it redis-8003 bash
redis-cli -a test@123 -p 8003 cluster meet 172.18.0.2 8000
exit
 
docker exec -it redis-8004 bash
redis-cli -a test@123 -p 8004 cluster meet 172.18.0.2 8000
exit
 
docker exec -it redis-8005 bash
redis-cli -a test@123 -p 8005 cluster meet 172.18.0.2 8000
exit

# 查看redis-cluster
docker exec -it redis-8000 bash
redis-cli -a test@123 -p 8000 cluster nodes

基于Docker发布ruoyi

# 将ruoyi的jar包拷贝
# root @ ubuntu in ~/ruoyi [22:19:06]
$ ll
total 70M
-rw-r--r-- 1 root root 117 Jul  5 23:30 DockerFile
-rw-r--r-- 1 root root 70M Jul  5 23:30 ruoyi-admin.jar

# 编写DockerFile,填入如下内容
FROM java:8

COPY *.jar /app.jar

CMD ["--server.port=8080"]

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "/app.jar"]

# 生成docker镜像
# root @ ubuntu in ~/ruoyi [22:20:15]
$ docker build -f DockerFile -t rouyi .
Sending build context to Docker daemon  73.33MB
Step 1/5 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/5 : COPY *.jar /app.jar
 ---> Using cache
 ---> 929ad15977f2
Step 3/5 : CMD ["--server.port=8080"]
 ---> Using cache
 ---> a3dc98ba77de
Step 4/5 : EXPOSE 8080
 ---> Using cache
 ---> e7b96e307687
Step 5/5 : ENTRYPOINT ["java", "-jar", "/app.jar"]
 ---> Using cache
 ---> d2dee089a684
Successfully built d2dee089a684
Successfully tagged rouyi:latest

# 启动docker容器
# root @ ubuntu in ~/ruoyi [22:22:32]
$ docker run -d -p 8888:8080 --name ruoyi rouyi
c57398109db87a5703f47d3c5fce46c095fbb96e56047a5c5e081731fb7cc4e3

# root @ ubuntu in ~/ruoyi [22:22:36]
$ docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED          STATUS         PORTS                                                                                                NAMES
c57398109db8   rouyi                 "java -jar /app.jar …"   10 seconds ago   Up 9 seconds   0.0.0.0:8888->8080/tcp, :::8888->8080/tcp                                                            ruoyi
e48568642793   mysql                 "docker-entrypoint.s…"   47 hours ago     Up 47 hours    33060/tcp, 0.0.0.0:3333->3306/tcp, :::3333->3306/tcp                                                 mysql4ruoyi
9461c8419d73   portainer/portainer   "/portainer"             3 days ago       Up 3 days      0.0.0.0:9000->9000/tcp, :::9000->9000/tcp                                                            dreamy_bhabha
8d0bb2e1f09b   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8005->8005/tcp, :::8005->8005/tcp, 6379/tcp, 0.0.0.0:18005->18005/tcp, :::18005->18005/tcp   redis-8005
5af384853d00   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8004->8004/tcp, :::8004->8004/tcp, 6379/tcp, 0.0.0.0:18004->18004/tcp, :::18004->18004/tcp   redis-8004
a983a4a11540   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8003->8003/tcp, :::8003->8003/tcp, 6379/tcp, 0.0.0.0:18003->18003/tcp, :::18003->18003/tcp   redis-8003
0dad67cbc82a   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8002->8002/tcp, :::8002->8002/tcp, 6379/tcp, 0.0.0.0:18002->18002/tcp, :::18002->18002/tcp   redis-8002
9061c96c81aa   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8001->8001/tcp, :::8001->8001/tcp, 6379/tcp, 0.0.0.0:18001->18001/tcp, :::18001->18001/tcp   redis-8001
a610fbf380cb   redis:5.0.5           "docker-entrypoint.s…"   3 days ago       Up 3 days      0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 6379/tcp, 0.0.0.0:18000->18000/tcp, :::18000->18000/tcp   redis-8000

原文地址:https://www.cnblogs.com/yaohl0911/p/14980183.html