Docker学习笔记,参照尚硅谷教程,以及一些自己的使用经理,未完结
运行环境和配置问题的软件容器
环境
,运维那边拿到代码可能跑不起来,环境配置不一样源代码+配置+环境+版本====>打成一个镜像文件
====>docker:镜像即应用
一次镜像,处处运行————从搬家变成搬楼
硬件后,在上面运行一个完整的操作系统,再在上面跑程序
隔离开的一系列进程
镜像运行,由该镜像提供支持进程所需的全部文件
,容器和虚拟机的区别在于容器不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置
操作系统层面上实现虚拟化,直接复用本地的操作系统,相比于虚拟机有启动速度快,占用体积小的特点
容器运行载体(管理引擎)
,通过镜像创建出docker实例(类比java中new一个对象)开发兼运维
dockerhub
yum -y install gcc
yum -y install gcc-c++
sudo yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl start docker
docker run hello-world
systemctl start docker
systemctl stop docker
systemctl restart docker
systemctl enable docker # 开机自动启动docker
docker info # docker概要信息
docker --help # 总体帮助文档
docker 命令 --help # 具体命令的帮助文档
docker images #查看本地镜像
docker search 镜像名
docker pull 镜像名字[:TAG]
# 不写TAG就默认最新的
docker pull redis:6.0.8
docker system df
docker rmi -f 镜像ID
交互模式操作,同时要开启一个伪终端
-i 交互模式操作
-t 开启一个伪终端
--name= 可以容器名字
-P #随机端口映射
-p 主机端口:容器内端口 #指定端口映射,主机的端口映射到而哦那个其的端口 -p 8080:80
希望有个交互式shell,就使用/bin/bash
docker run -it --name=ubntu01 ubuntu /bin/bash #就可以将ubuntu镜像实例成一个容器,同时弹出一个伪终端可以操作
exit 退出
docker ps #当前活着的
docker ps -a #当前的+历史上出现过的
docker ps -l#最近创建的
exit #退出之后容器终止
ctrl+p+q #退出之后容器不终止
docker exec -it 容器id /bin/bash #在容器中打开了新的终端,使用exit不会终止容器
docker attach 容器ID # 直接进入容器中启动命令的终端,使用exit会终止容器
docker start 容器ID
docker kill 容器ID/容器名
docker rm 容器id
要先停止才能删掉
docker run -d 镜像
docker log # 查看日志
docker tops # 查看容器内运行进程
docker cp 容器ID:容器内的路径 主机内的路径
docker cp
# 直接打成一个tar包
docker export 容器ID > name.tar
cat tar包名字 | docker import - 镜像用户/镜像名:镜像版本号
docker commit -m="镜像描述信息" -a="作者" 该镜像的容器ID 镜像用户/镜像名:镜像版本号
docker pull registry
基础镜像,镜像可以通过分层进行集成,制作出各种具体的应用镜像
只在内存中加载一份那个镜像,就可以为所有容器服务了,镜像每一层可以被共享
镜像层都是只读的,容器层是可写的
,容器启动时,一个新的可写层被加载到镜像顶部,这一层叫容器层,下面的都叫镜像层
数据的持久化,容器内的数据持久化到本地主机目录
,容器挂了数据还在docker run -it --privileged=true -v/宿主绝对路径目录:/容器内目录 镜像名 #默认是读写都可rw
docker run -it --privileged=true -v/宿主绝对路径目录:/容器内目录:ro 镜像名 #加了:ro就是只读的了
一个容器的数据卷可以继承自别的容器的数据卷
--volumes-from 要继承的容器名字
# 第一个叫u1的容器绑定了数据卷
docker run -it --privileged=true -v/tmp/docker-tmp:/tmp/docker-temp --name="u1" ubuntu
# 第二个叫u2的继承了u1的数据卷
docker run -it --privileged=true -v/tmp/docker-tmp:/tmp/docker-temp --name="u1" ubuntu
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name="tomcat" billygoo/tomcat8-jdk8
docker run -d -p 3306:3306 --privileged=true -v /usr/local/mysql/log:/var/log/mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name my-mysql mysq
docker run -d --privileged=true --name=geolopgy_nginx -p 84:80 -v /app/geology_nginx/html:/usr/share/nginx/html -v /app/geology_nginx/nginx.conf:/etc/nginx/nginx.conf 2b7d6430f78d
docker run -p 6379:6379 --name redis --privileged=true -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data -d redis redis-server /etc/redis/redis.conf
docker exec -it redis容器ID /bin/bash
redis-cli #可以设置键值,即成功
必须大写且后面至少跟一个参数
创建一个新的镜像层并对镜像进行提交
已经存在的镜像作为模板,第一条必须是FROM
最后的一个生效
,CMD会被docker run 后的参数覆盖,和RUN的区别,RUN是在docker build时运行,CMD是在docker run 时运行
当作参数作为ENTRYPOINT指令指定的程序
,如果ENTRYPOINT和CMD一起出现,CMD会被作为参数传递给ENTRYPOINT指令
FROM java:8
MAINTAINER RedGhost
VOLUME /tmp
ADD lskxpro-0.0.1-SNAPSHOT.jar lskxpro.jar
RUN bash -c 'touch /lskxpro.jar'
ENTRYPOINT ["java","-jar","lskxpro.jar"]
EXPOSE 8082
记得有个.
docker build -t 镜像名:版本 .
docker build -t lskxpro:1.0 .
在运行镜像的时候可以加上--network=
来指定网络模式
docker network ls
docker0
(虚拟网桥)--network container:要共用的container的名字或id
写死的ip,如果容器重启了ip会改变
这种问题docker network create 自己起的网络模式名字
--network szk_network
容器名来通信
(ip和域名都能ping通)网桥
,他在内核层联通了其他的物理和虚拟网卡,将所有容器和本地主机放到同一个物理网络,让主机和容器之间可以进行网络通信
有启动顺序和和加载条件
,就像spring做的事一样协调好多个容器之间的调用关系
官网安装方法
# 官网给的github的太慢了,用这个命令
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
version: "3"
services:
microService:
image: lskx-pro:1.1
container_name: lskx-pro
ports:
- "8082:8082"
privileged: true
volumes:
- /app/microService:/data
command:
- spring.profiles.active=pro
networks:
- red-ghost-network
depends_on:
- redis
- mysql
- nginx
redis:
image: redis:latest
privileged: true
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf:rw
- /app/redis/data:/data:rw
networks:
- red-ghost-network
command: redis-server /etc/redis/redis.conf --requirepass 123456
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'lskxweb'
ports:
- "3306:3306"
privileged: true
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/conf/logs:/logs
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- red-ghost-network
command: --default-authentication-plugin=mysql_native_password
nginx:
image: nginx
ports:
- "83:80"
networks:
- red-ghost-network
volumes:
- /app/nginx/html:/usr/share/nginx/html
privileged: true
tty: true
command: /bin/bash
networks:
red-ghost-network: