docker
应该早点学习docker的,真的特别好用。
使用最重要的就是清楚端口映射
代码语言:javascript复制例如:docker run -d -p 8080:8080 tomcat
代码语言:javascript复制个人开启docker之后的常用命令
docker ps -aq
docker ps
docker start mysql57
docker exec -it 容器id bash
1、安装
个人推荐使用第二种方式,第一种安装方式安装的是 1.13.1 的版本,第二种安装的是最新版,我今天安装完之后是 20.10.8 版本。
代码语言:javascript复制第一种安装方式:
yum install docker -y
Dokcer hub镜像加速
/etc/docker/daemon.json
{"registry-mirrors":["https://gg3gwnry.mirror.aliyuncs.com"]}
第二种安装方式:
需要的安装包
yum install -y yum-utils
设置镜像的仓库
yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新yum软件包
yum makecache fast
安装社区版
yum install docker-ce docker-ce-cli containerd.io
可以配置一个阿里云加速镜像 加快下载速度
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://a5pog71k.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
测试
代码语言:javascript复制显示出版本信息 测试一下就可以了
docker version (或者输入 docker -v 或者 docker --version)
查看docker系统信息
docker info
查看所有帮助命令
docker
查看某个命令的帮助信息 (command 例如:docker run --help)
docker commond --help
启动
代码语言:javascript复制启动docker
systemctl start docker
停止docker
systemctl stop docker
重启docker
systemctl restart docker
查看docker运行状态
systemctl status docker
查看docker进程
ps -ef | grep docker
设置docker开机自启动
systemctl enable docker
设置容器开机自动启动
创建容器时,设置自动启动容器
docker run --restart=always 容器id(或者容器名称)
如果创建时未指定 --restart=always ,可通过update 命令设置
docker update --restart=always 容器id(或者容器名称)
2、镜像命令
代码语言:javascript复制查看下载的镜像
docker images
只查看镜像id
docker ps -aq
搜索镜像
docker search tomcat
搜索镜像,收藏数大于3000的
docker search mysql --filter=STARS=3000
下载镜像 默认最新版本 docker pull 镜像名[:tag]
docker pull mysql
下载mysql5.7
docker pull mysql:5.7
删除镜像 空格删除多个容器
docker rmi -f 镜像id
删除所有镜像
docker rmi -f $(docker images -aq)
保存新镜像,这样每次修改完 数据都还在,可理解为Linux的快照
docker commit 容器id 镜像名
比如:docker commit es48s4ds5se mysql0812
3、容器命令
代码语言:javascript复制下载一个centos进行学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字,用来区分容器
-d 后台启动
-it 使用交互式运行
-p 指定容器端口 8081:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 常用
-p 容器端口
容器端口
-P 随机指定端口
列出所有运行的容器
docker ps
-a 正在运行的容器
-n=? 显示个数 最近创建的容器
-q 只显示id
查询启动的容器id
docker ps -aq
启动并进入centos容器
docker run -it centos /bin/bash
退出
exit # 直接容器停止并退出
Ctrl P Q # 容器不停止退出
删除指定容器
docker rm 容器id
删除所有容器
docker rm -f $(docker ps -aq)
管道符删除 删除所有
docker ps -a -q|xargs docker rm
启动容器 一般启动的时候都会进行端口映射(docker run -d -p 8080:8080 tomcat)
docker start 容器id
查看容器的更多信息
docker inspect 容器id/名称
进入docker容器(71858d5c1af9 容器id,最后的那个/bin/bash可以直接写 bash)
docker exec -it 71858d5c1af9 /bin/bash
重启容器
docker restart 容器id
停止容器
docker stop 容器id
停止全部运行中的容器
docker stop $(docker ps -q)
停用并删除容器
docker stop $(docker ps -q) & docker rm -f $(docker ps -aq)
强制停止当前容器
docker kill 容器id
4、其他命令
代码语言:javascript复制后台启动 -d
docker run -d 镜像名
查看日志
docker logs -f -t --tail 容器id
-tf 显示日志
--tail n 显示多少行
查看容器中的进程信息
docker top 容器id
查看容器详细信息 元数据
docker inspect 容器id
进入当前运行的容器
方式1: docker exec -it 容器id bash
方式2: docker attach 容器id (它进入的是正在运行的窗口,正在执行)
区别:
exec 进入容器是一个新的终端
attach 不会启动新的进程
拷贝文件到主机
docker cp 容器id:容器内路径 主机的路径
查看CPU使用率
docker stat
5、使用案例
nginx
代码语言:javascript复制下载nginx镜像
docker pull nginx
启动nginx
docker run -d --name nginx01 -p 5555:80 nginx
参数解释:
-d 代表后台启动
--name 相当于别名
-p 端口映射 第一个是Linux的端口,第二个是容器的端口
测试本机访问,然后再去浏览器访问
curl localhost:3344
tomcat
代码语言:javascript复制下载镜像
docker pull tomcat
启动镜像
docker run -d -p 8081:8080 tomcat
zookeeper
代码语言:javascript复制安装Zookeeper,开发分布式dubbo项目Zookeeper作为注册中心试验
下载镜像
docker pull zookeeper
启动
docker run -p 2181:2181 -d zookeeper
进入容器
docker exec -it 容器id bash
window可以使用客户端工具访问Zookeeper
zookeeper图形化的客户端工具(ZooInspector)
https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
6、mysql数据持久化
代码语言:javascript复制安装mysql 如果不指定版本默认就是8.x的版本,
docker pull mysql:5.7
启动mysql
docker run -p 3306:3306 -e MYSQL_DATABASE=mytest-e
MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
参数解读:
-p 端口映射
-e 环境变量
-d 后台启动
进入容器
docker exec -it ID号 bash
配置文件映射、数据库文件映射
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=145263 --name mysql57 mysql:5.7
参数解释:
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
以后在启动的时候直接 (方便又快捷)
docker start mysql57
因为这个是mysql5.7的版本,使用Navicat测试,直接就连上了
mysql 8.x版本需要的配置
docker pull mysql
启动mysql
docker run -p 3306:3306 -e MYSQL_DATABASE=test-e
MYSQL_ROOT_PASSWORD=123456 -d mysql
进入容器
docker exec -it ID号 bash
登录mysql
mysql -u root -p
修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '145263';
授权远程登录访问
CREATE USER 'ligang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON*.* TO 'zhangsan'@'%';
设置root密码永不过期
alter user 'root'@'%' identified by '145263' password expire never;
修改加密方式
alter user 'root'@'%' identified with mysql_native_password by '123456';
刷新权限
flush privileges;
7、jar包部署
方式1
代码语言:javascript复制1、定义一个Dockerfile文件
FROM java
MAINTAINER zhangsan
ADD demo-1.0.0.jar /opt
RUN chmod x /opt/demo-1.0.0.jar
CMD java -jar /opt/demo-1.0.0.jar
2、构建镜像
docker build -t demo-1.0.0.jar .
3、运行容器: (8ed7368ff4c1) id号
端口映射: docker run -d -p 8080:8080 8ed7368ff4c1
4、测试
curl localhost 8080
方式2
代码语言:javascript复制1、定义一个Dockerfile文件
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
2、构建镜像
docker build -t xiaolizi .
3、运行容器 xiaolitest666 相当于容器的别名 xiaolizi 是镜像的名字
docker run -d -p 8080:8080 --name xiaolitest666 xiaolizi
4、测试
curl localhost 8080
部署war包
代码语言:javascript复制1、定义Dockerfile文件
FROM tomcat
MAINTAINER zhangsan
ADD demo-1.0.0.war /usr/local/tomcat/webapps
EXPOSE 8080
CMD /usr/local/tomcat/bin/catalina.sh run
2、构建镜像
docker build -t demo-1.0.0.war .
3、运行镜像
docker run -d -p 8080:8080 7d8bb560d486
4、访问的时候加项目访问路径:demo-1.0.0
参数解释
命令 | 效果 |
---|---|
FROM | 基础镜像:Centos/Ubuntu/Java |
MAINTAINER | 镜像作者 |
RUN | 镜像构建的时候需要运行的命令 |
ADD | 为镜像添加内容(压缩包) |
COPY | 类似于ADD,将文件拷贝到镜像中 |
EXPOSE | 暴露端口 |
CMD/ENTRYPOINT | 指定这个容器启动时要运行的命令(CMD替代先前命令,ENTRYPOINT在先前命令后追加) |
8、自定义镜像
代码语言:javascript复制自定义JDK镜像 这个文件名是固定的,D大写
1、创建 Dockerfile 文件,写入配置信息(vim Dockerfile)
FROM centos:latest
MAINTAINER zhangtest
ADD jdk-8u241-linux-x64.tar.gz /usr/local
ENV JAVA_HOME /usr/local/jdk1.8.0_241
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
CMD java-version
2、构建镜像
docker build -t zhango_jdk1.8.0_241 .
3、然后可以查看到自己的镜像
docker images
4、运行镜像就可以显示出JDK版本信息
docker run -d 容器id
解读
代码语言:javascript复制FROM
格式为 FROM<image> 或 <image>:<tag>
Dockerfile文件的第一条指令必须为FROM指令,并且,如果在同一个Dockerfile中创建多个镜像时,
可以使用多个FROM指令(每个镜像一次);
MAINTAINER
格式为MAINTAINER<name>,指定维护者信息
ENV
格式为ENV<key><value>,指定一个环节变量,会被后续RUN指令使用,并在容器运行时保持
ADD
格式为ADD<src><dest> 复制到指定的<src>到容器中的<dest>
EXPOSE
格式为EXPOSE<port><port>...
告诉Docker服务端容器暴露的端口号,供互联系统使用,在启动容器时需要通过-p映射端口,
Docker主机会自动分配一个端口转发到指定的端口
RUN
格式为RUN<command>
RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,当命令较长时可以使用来换行
CMD
指定启动容器时执行的命令,每个Dockerfile只能有一条CMD命令。
如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令
可能遇到的错误
Error response from daemon: Cannot restart container 1740d55e9f32: driver failed programming external connectivity on endpoint mysql57 (1dd8cc83f8a80b632e05663f9e4757ce0af69bb6acf6ed8456a65afc88d46746): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 3310 -j DNAT --to-destination 172.17.0.2:3306 ! -i docker0: iptables: No chain/target/match by that name. (exit status 1))
代码语言:javascript复制定位问题:docker服务启动时定义的自定义链DOCKER被清除
重启docker即可
systemctl restart docker