文章目录
Docker简介
Docker是一个开源的应用容器引擎;是一个轻量级容器技术;
Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;
运行中的这个镜像称为容器,容器启动是非常快速的。
Docker核心概念
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用.
安装Docker
安装Docker
yum install -y docker
启动Docker
systemctl start docker
开启开机启动
systemctl enable docker
systemctl enable docker --now
查看Docker信息
docker info
查看docker版本
sudo docker version
更换镜像源
docker 工作的基础即是镜像。您可以认为一个镜像即是一个独立的由应用组成的虚拟机。为此,docker 建立了docker hub来存贮镜像(就像GitHub一样)。但是由于网络原因, docker hub 的访问速度过慢,推荐您更换为国内的镜像源地址。
# vi /etc/docker/daemon.json
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
systemctl restart docker.service
sudo su -
cat >> /etc/docker/daemon.json <<- EOF
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
systemctl restart docker
exit
安装镜像
搜索镜像
推荐去 https://hub.docker.com/
docker search 关键字
docker search redis
拉取镜像
:tag是可选的,tag表示标签,多为软件的版本,默认是latest
docker pull 镜像名:tag
docker pull redis:latest
查看所有本地镜像
docker images
sudo docker image ls
删除镜像
docker rmi image-id
启动容器
sudo docker run --rm -d -p 80:80 --name nginx nginx:alpine
–rm:表示这个容器执行完后会被直接销毁。
–name:指定这个容器的名称。
-d:表示这个容器会在后台运行。
-p:表示开放容器的80端口到主机的80端口。 主机:容器
-v:表示将nginx的配置文件挂载到容器的对应目录下。
查看所有的容器
docker ps ‐a
停止一个容器
您随时可以使用sudo docker stop <容器ID 或 容器名称>
来停止一个容器
sudo docker stop nginx
安装 docker-compose
docker-compose 是 docker 的多个服务部署工具,以方便地同时启动多个容器。
您可以使用以下命令方便地安装它。
sudo apt-get install -y python-pip && sudo pip install docker-compose
报错 Error response from daemon: Error running deviceCreate (createSnapDevice) dm_task_run failed
解决方法
方法1
[root@a~]# systemctl stop docker.service | service docker stop
[root@a~]# thin_check /var/lib/docker/devicemapper/devicemapper/metadata
[root@a~]# thin_check --clear-needs-check-flag /var/lib/docker/devicemapper/devicemapper/metadata
[root@a~]# systemctl start docker.service | service docker start
方法2
systemctl stop docker.service
mv /var/lib/docker/ /var/lib/docker.backup
systemctl start docker.service
修改容器内容
例如我们现在安装了Nginx,现在想修改默认的index.html 页面
1、进容器内部修改
进入容器内部的系统,修改容器内容
通过该命令可进入该容器,里面如同一个小型Linux环境。
docker exec -it 容器id /bin/bash
2、挂载数据到外部修改
docker run --name=mynginx \
-d --restart=always \
-p 88:80 -v /data/html:/usr/share/nginx/html:ro \
nginx
-v指的是挂载,将容器的/usr/share/nginx/html挂载到主机的/data/html(后面挂到前面),ro:只读模式
修改页面只需要去 主机的 /data/html,也可以挂载配置的文件,因为在ngnix镜像内修改不方便,可能没有vim命令,所以挂载到主机环境,就能方便的修改。
3、或者手动复制
# 将主机的文件复制到容器中
docker cp [OPTIONS] SRC_ PATH CONTAINER:DEST_PATH
# 将容器中的文件复制到主机
docker cp [OPTIONS] CONTAINER:SRC_ PATH DEST_ PATH
挂载
将主机的某个目录跟容器的目录关联起来,修改主机目录就相当于修改容器目录,示例见上面 2、挂载数据到外部修改
提交-保存镜像
1、将自己修改好的镜像提交,下次崩了还可以安装同样配置的。类似git commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit -a "leifengyang" -m "首页变化" 341d81f7504f guignginx:v1.0
2、将本地镜像保存为文件,安装到其它主机
# 将镜像保存成压缩包,将abc.tar传给其它主机
docker save -o abc.tar guignginx:v1.0
# 别的机器加载这个镜像 离线安装
docker load -i abc.tar
3、推送远程仓库
推送镜像到docker hub;应用市场
略
docker network
查看 docker network
查看容器IP
cat /etc/hosts
docker inspect <container id>
或者
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container id>
要获取所有容器名称及其IP地址只需一个命令。
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
docker查看容器IP的方法
https://blog.youkuaiyun.com/koonsuen/article/details/105785380
容器之间互访
Docker容器之间互访
https://blog.youkuaiyun.com/lcgskycby/article/details/108586358
docker compose
常用命令
docker-compose.yml 配置文件编写详解
https://blog.youkuaiyun.com/qq_36148847/article/details/79427878
进阶实战:Java应用
1、编写一个HelloWorld应用 https://start.spring.io/
示例代码: https://gitee.com/leifengyang/java-demo.git
配置redis
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#redis使用自定义配置文件启动
docker run -v /data/redis/redis.conf:/etc/redis/redis.conf \
-v /data/redis/data:/data \
-d --name myredis \
-p 6379:6379 \
redis:latest redis-server /etc/redis/redis.conf
最终应用界面:写一个Controller模拟网页访问次数,数据值保存在redis中。
2、将应用打包成镜像
以前:Java为例 ● SpringBoot打包成可执行jar ● 把jar包上传给服务 ● 服务器运行java -jar
编写Dockerfile将自己的应用打包镜像
FROM openjdk:8-jdk-slim
LABEL maintainer=leifengyang
COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
-
openjdk:8-jdk-slim可以从dockerhub搜到
-
/app.jar是指小型linux
之后执行
docker build -t java-demo:v1.0 .
-t 后面跟的是要打包成的镜像名字
不要忘记最后的点
启动容器
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
分享镜像供其他机器使用
# 登录docker hub
docker login
#给旧镜像起名
docker tag java-demo:v1.0 leifengyang/java-demo:v1.0
# 推送到docker hub
docker push leifengyang/java-demo:v1.0
# 别的机器
docker pull leifengyang/java-demo:v1.0
# 别的机器运行
docker run -d -p 8080:8080 --name myjava-app java-demo:v1.0
安装MySQL示例
docker pull mysql
https://hub.docker.com/
docker images
docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
进入mysql容器,并登陆mysql
[root@VM-6-143-centos ~]# docker exec -it mysql bash
root@157b4be75770:/# mysql -uroot -p
参考
https://www.cnblogs.com/jiefu/p/12204555.html
下面代码有问题
# 把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹里面 改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql)
docker run ‐‐name mysql03 ‐v /conf/mysql:/etc/mysql/conf.d ‐e MYSQL_ROOT_PASSWORD=my‐secret‐pw ‐d mysql:tag
# 指定mysql的一些配置参数
docker run -itd --name some‐mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character‐setserver=utf8mb4 --collation-server=utf8mb4_unicode_ci
部署前后端分离项目
Docker部署前后端分离项目(超详细)个人总结
https://blog.youkuaiyun.com/qq_45743005/article/details/119922465
更多命令参考
https://docs.docker.com/engine/reference/commandline/docker/