Docker常用指令

下载Docker

Install Docker Engine on CentOS | Docker Documentation

基本操作

启动dockersystemctl start docker
显示docker的版本信息docker version
显示docker的系统信息,包括镜像和容器的数量docker info
帮助命令docker 命令 --help
查看所有本地主机上的镜像docker images
搜索镜像docker search
下载镜像docker pull
删除镜像docker rmi -f 镜像id
新建容器并启动docker run 镜像id
列出所有运行的容器docker ps
容器id 删除指定容器docker rm
删除指定的容器(这里示范删除全部容器)docker rm -f $(docker ps -aq)
启动容器docker start 容器id
重启容器docker restart容器id
停止当前正在运行的容器docker stop 容器id
强制停止当前容docker kill 容器id
查看容器中的进程信息docker top 容器id

进入容器终端docker exec -it 容器id

进入当前容器后开启一个新的终端,可以在里面操作docker exec
进入容器正在执行的终端docker attach
从容器内拷贝到主机上docker cp 容器id:容器内路径 主机目的路径
创建容器

1
2
3
4
5
BASH
docker run -d -p 8080:8080 --name tomcat01 tomcat
#-d 后台运行
#-p 宿主机端口:容器内部端口
#-name 给容器命名

查看docker内存使用情况docker stats
测试容器curl ip地址:端口

可视化工具portainerdocker run -d -p 8080:9000 \--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

UnionFs (联合文件系统)

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
boots(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel,
Linux刚启动时会加bootfs文件系统,在 Docker镜像的最底层是 boots。这一层与我们典型的
Linux/Unix系统是一样的,包含boot加載器和内核。当boot加载完成之后整个内核就都在内存中了,此时
内存的使用权已由 bootfs转交给内核,此时系统也会卸载bootfs。
rootfs(root file system),在 bootfs之上。包含的就是典型 Linux系统中
的/dev,/proc,/bin,/etc等标准目录和文件。 rootfs就是各种不同的操作系统发行版,比如 Ubuntu,
Centos等等。

提交镜像文件

1
2
3
BASH
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker commit -a="kuangshen" -m="add webapps app" 容器id tomcat02:1.0

数据卷(可理解为宿主机与容器的双向文件同步绑定)

1
2
3
4
5
6
7
BASH
docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
-- name 容器名字

三种挂载: 匿名挂载、具名挂载、指定路径挂载

匿名挂载 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx
具名挂载 -v 卷名:容器内路径 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
指定路径挂载 -v /宿主机路径:容器内路径

权限

1
docker run -d -P --name nginx05 -v juming:/etc/nginx:ro nginx

ro #readonly 只读
rw #readwrite 可读可写

ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

DockerFile常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BASH
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指
令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!

构建镜像 docker build -f mydockerfile-centos -t mycentos:0.1 .

1
docker build -f 文件路径 -t 镜像名:[tag] .

实操—构建镜像

1.准备镜像文件

2.编写dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
BASH
FROM centos:7
MAINTAINER cheng<1204598429@qq.com>
COPY README /usr/local/README #复制文件
ADD jdk-8u231-linux-x64.tar.gz /usr/local/ #复制解压
ADD apache-tomcat-9.0.35.tar.gz /usr/local/ #复制解压
RUN yum -y install vim
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
ENV JAVA_HOME /usr/local/jdk1.8.0_231 #设置环境变量
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.35 #设置环境变量
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib #设置环境变量 分隔符是:
EXPOSE 8080 #设置暴露的端口
CMD /usr/local/apache-tomcat-9.0.35/bin/startup.sh && tail -F /usr/local/apachetomcat-9.0.35/logs/catalina.out # 设置默认命令

3.构建镜像

1
docker build -t mytomcat:0.1 .

4.启动镜像

1
2
BASH
docker run -d -p 8080:8080 --name tomcat03 -v/home/liuguifan/build/tomcat/test:/usr/local/apache-tomcat-9.0.75/webapps/test -v /home/liuguifan/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.75/logs mytomcat

发布docker

登录:docker login

构建:docker build -t username/mytomcat:0.1 .

执行docker tag 容器id chengcoder/mytomcat:1.0

1
docker push mytomcat

docker运行流程

img

docker网络

Linux 虚拟网络设备 veth-pair 详解,看这一篇就够了 - bakari - 博客园 (cnblogs.com)

在容器中安装网络工具:

ifconfig: yum -y install net-tools

ip addr: yum -y installiproute

创建网络docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

查看网络:docker network inspect mynet

用自建网络启动容器docker run -d -P --name my-web01 --net mynet mytomcat

网络连通docker network connect mynet mytomcat

不同网段的容器联通,就是将 tomcat01加到 mynet网络 。一个容器两个ip

实战:部署redis cluster集群

创建网络docker network create redis --subnet 172.38.0.0/16

脚本创建六个redis单机配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BASH
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/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

启动六个redis服务

1
2
3
4
5
6
7
8
BASH
for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

进入一个redisdocker exec -it redis-1 /bin/sh

创建集群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

查看集群状态cluster info cluster nodes

springboot打包成镜像

编写dockerfile

1
2
3
4
5
6
DOCKERFILE
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

构建镜像docker build -t --name imagename .

运行容器

或者:

1
2
3
4
5
6
7
8
9
DOCKERFILE
FROM openjdk:8-jdk-alpine
VOLUME /tmp
#把当前项目下dockertest-0.0.1-SNAPSHOT.jar 改名为test.jar 添加到镜像中
ADD web-app-template-1.0.0.jar test.jar
#指定端口,最好写与项目配置的端口
EXPOSE 8080
#在镜像中运行/test.jar包,这样在运行镜像的时候就已经启动好了test.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/test.jar"]

docker swarm

需要在同一内网(不同需要认证)

在要配置的机器上执行:

docker swarm join-token manager

1
docker swarm join-token worker

获取token令牌(是一个命令)

然后在主节点上执行即可