docker常用命令
这些官方文档中都有,想查命令最好直接看官方文档,我这里记录只是自己练习使用,加深印象,官方连接:参考文档
# docker信息
docker info
docker version
# 查看所有镜像文件,-a查询所有,-q只显示id
docker images -aq
# 查看现在在运行的容器
docker ps
# 查看所有的容器,-a查询所有
docker ps -a
# 拉取镜像
docker pull nginx:latest
docker pull tomcat:latest
docker pull redis:latest
# linux命令,搜索nginx
whereis nginx
# 运行一个tomcat容器,如果本地没有会从服务器上下载
# -d 是后台运行
# -it 交互方式运行,进入容器
# --rm 是运行完删除此容器(可不用加此参数)
# -p 指定端口[主机端口:容器内端口]
# -P 随机端口(大P)
# --ip 可以指定ip
docker run -d -it --rm -p 8080:8080 --name tomcat01 tomcat:9.0 /bin/bash
# 启动、停止、重启
docker start nginx01 # 启动容器
docker restart nginx01 # 重启容器
docker stop nginx01 # 停止现在运行的容器
docker kill nginx01 # 强制停止运行的容器
# 删除镜像
docker rmi -f 镜像名
docker rmi -f $(docker images -aq)
# 删除容器
docker rm -f 容器id # 删除指定容器
docker rm -f $(docker ps -aq) # 删除所有容器
docker ps -aq |xargs docker rm # 删除所有容器
# 退出容器
exit # 如没有运行任何服务则直接停止容器并退出
Ctrl + P + Q # 容器不停止并退出
# 查看容器的日志
# -t 显示时间戳
docker logs -tf 容器id
# 查看容器的进程
docker top 容器id
# 查看容器的信息
docker inspect 容器id
# 进入到容器里面
docker exec -it 容器id /bin/bash # 新建进程进入
docker attach 容器id # 进入到现在运行的进程中
# 复制文件
docker cp 容器id:容器内路径 目的地的主机路径
# 提交
docker commit -a iaiai -m="is nginx" 容器id 目标镜像名:[TAG]
# 容器数据卷(主机目录和容器目录共享同一个目录)
docker run -d -v 主机目录:容器目录 centos /bin/bash
# 修改镜像的名子 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag 原镜像id 新的名称:1.0
# 如果容器启动的时候报错启不启来则用下面命令查看日志
docker logs 97069f94437b(容器id)
# 导出镜像文件
docker save -o 要保存的文件名 要保存的镜像
docker save -o java8.tar lwieske/java-8
# 导入镜像
docker load --input 文件
或者
docker load < 文件名
portainer可视化容器
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
Dockerfile构建镜像文件
FROM centos
# 把当前目录下两个压缩包放到容器的/usr/local/目录下并且解压,ADD命令会自动解压
ADD jdk-8ull-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
# 安装vim
RUN yum install vim
# 配置环境变量MYPATH
ENV MYPATH /usr/local
# 配置工作目录,一进入到容器后所到的目录
WORKDIR $MYPATH
# 配置JAVA_HOME环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 配置tomcat环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
# 把自定义环境变量加到PATH中
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
# 对外暴露的接口
EXPOSE 8080
# 全部完成之后执行的命令
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0.22/bin/logs/catalina.out
执行项目jar包的示例,自行修改为自己的jar包
FROM java:8
ADD project.jar ~/project.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","~/project.jar","--spring.profiles.active=dev"]
# 执行镜像文件,默认Dockerfile文件的话可不用写这个,最后一定要加上点
docker build -f Dockerfile -t iaiai-centos .
# 如果启动多个相同镜像并且共享之前centos1的卷的话,需要用--volumes-from
docker run -it --name centos2 --volumes-from centos1 iaiai-centos:1.0
代码提交到DockerHub上,阿里云上也有容器镜像服务并且是免费可用的,建议大家去阿里云上注册个账号去申请一下,并且命令阿里云上都写得很清楚了
# 先登录,先去docker hub上注册用户,注册成功之后用这个账号登录
docker login -u 用户名
# 提交上去自己的镜像文件,dcker push 本地镜像名:版本号
dcker push project:1.0
网络命令
# 查看容器的ip地址,首先容器必须是可执行后面的命令
docker exec -it 容器 ip addr
# 运行第二个tomcat,link是在第个系统中增加了个host,运行成功后在tomcat01中可直接ping tomcat01
docker run -d -P --name tomcat02 --link tomcat01 tomcat
# 查看现在所有的网络
docker network ls
# 查看上面列出来的网络id的信息
docker network inspect 网络id
# 删除一个网络
docker network rm 网络id
# 新建一个网络名
# --driver bridge 桥接的方式
# --subnet 192.168.0.0/16 配置网络(192.168.0.2 ~ 192.168.255.255)
# --gateway 192.168.0.1 配置网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 网络名
# 在运行的时候--net bridge这个配置是默认,默认会是桥接的方式,这里可以指定网络
# 建好的网络运行的所有tomcat,都可以用ping tomcat01或是ping tomcat02来ping通
docker run -d -P --name tomcat01 --net 网络id tomcat
# 把容器添加到这网络中,比如容器建好后是对公网的,然后再建个内网网络,新建的容器加入到内网网络中就可以通过内网服务来通信
docker network connect 网络id 容器
redis集群示例
# 创建6个redis配置文件
for port in $(seq 1 6); \
do \
mkdir -p ./redis/node-${port}/conf
touch ./redis/node-${port}/conf/redis.conf
cat << EOF >./redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 运行6个redis容器
# 1
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /Users/iaiai/Desktop/docker/redis/node-1/data:/data \
-v /Users/iaiai/Desktop/docker/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis-net --ip 172.38.0.11 redis redis-server /etc/redis/redis.conf
# 2
docker run -p 6372:6379 -p 16372:16379 --name redis-2 \
-v /Users/iaiai/Desktop/docker/redis/node-2/data:/data \
-v /Users/iaiai/Desktop/docker/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis-net --ip 172.38.0.12 redis redis-server /etc/redis/redis.conf
# 3
docker run -p 6373:6379 -p 16373:16379 --name redis-3 \
-v /Users/iaiai/Desktop/docker/redis/node-3/data:/data \
-v /Users/iaiai/Desktop/docker/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis-net --ip 172.38.0.13 redis redis-server /etc/redis/redis.conf
# 4
docker run -p 6374:6379 -p 16374:16379 --name redis-4 \
-v /Users/iaiai/Desktop/docker/redis/node-4/data:/data \
-v /Users/iaiai/Desktop/docker/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis-net --ip 172.38.0.14 redis redis-server /etc/redis/redis.conf
# 5
docker run -p 6375:6379 -p 16375:16379 --name redis-5 \
-v /Users/iaiai/Desktop/docker/redis/node-5/data:/data \
-v /Users/iaiai/Desktop/docker/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis-net --ip 172.38.0.15 redis redis-server /etc/redis/redis.conf
# 6
docker run -p 6376:6379 -p 16376:16379 --name redis-6 \
-v /Users/iaiai/Desktop/docker/redis/node-6/data:/data \
-v /Users/iaiai/Desktop/docker/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \
-d --network redis-net --ip 172.38.0.16 redis redis-server /etc/redis/redis.conf
# 创建集群
redis-cli --cluster create \
172.38.0.11:6379 \
172.38.0.12:6379 \
172.38.0.13:6379 \
172.38.0.14:6379 \
172.38.0.15:6379 \
172.38.0.16:6379 \
--cluster-replicas 1