### docker基础命令
systemctl start docker
docker version 查看版本
docker info 显示当前docker状态
docker 显示可以的docker命令
docker container ps 列出当前正在运行的容器
docker container ps -a 列出当前所有的容器
docker system prune -f 清理删除已经退出的容器
docker image prune -a 清理没有使用的镜像
docker network ls 查看docker 提供的网络模式
### image镜像
镜像:包含文件系统,源码,库文件,依赖工具等运行application所需要的文件
container容器:一个运行中的docker image
#### 镜像命令
docker image ls 列出当前系统上存在的镜像
#### 容器命令
docker container ls 列出当前正在运行的容器
docker container run nginx 运行nginx
docker container stop nginx 停止nginx 可以只写开头的字母
docker container ls 可以省略为docker ls
docker container stop 加多个字符 可以停掉多个容器
docker container ps -aq 列出所有container的id
docker container stop $(docker container ps -qa) 批量关闭container
docker container rm $(docker container ps -qa) 批量删除container
不能删除正在运行的container,可以强制删除 docker container rm XXXXXX -f
docker container run --rm -it 加参数--rm 运行完就删除
attached模式 前台模式 前台执行
detached模式 后台模式 docker container run -d
docker attach XXID 可以变回attached模式
一般不使用attached模式(交互模式)
docker container run -d -p 80:80 nginx 创建端口映射的nginx
docker container logs XXXID 打印日志
docker container stop XXXXID 停止容器
docker container logs -f XXXID 动态跟踪日志
docker container run -it ubuntu sh 交互模式启动 退出就关闭了
docker exec -it XXXid sh 进入交互模式 退出不关闭 在一个已经运行的容器里执行一个额外的命令
docker container exec -it XXXID sh
docker container top 容器ID 查看容器中进程情况
#### 镜像获取
1. 镜像获取的3种方式
2. 从registry拉取(公私)
3. dockerfile构建 需联网
4. 导入(离线)
镜像的拉取 docker image pull nginx
docker image ls 列出本地存在的镜像
docker image pull nginx:1.20.0 拉取特定版本
docker image inspect imageID 查看镜像详细
docker image history imageXXXid 查看镜像分层
镜像导入导出
导出docker image save nginx:1.20.0 -o 文件名
导入docker image load -i 文件名
##### 构建dockerfile
事先创建好Dockerfile(默认的文件名就叫Dockerfile)
docker image build -t hello .
docker image build -t 镜像名称 Dockerfile所在目录
docker image build -t 镜像名称 -f dockerfile文件 所在目录
修改镜像标签
方法一. docker image build -t poiunet/hello:1.0 .
方法二. docker image tag hello poiunet/hello:1.0
删除镜像 docker image rm poiunet/hello:1.0
##### 推送镜像
登录dockerhub docker login
###### 推送image
docker image push poiunet/hello:1.0
###### 拉取image
docker pull poiunet/hello:1.0 (版本号要指定,除非指定了lastest版本)
#### 从容器创建镜像
docker container commit 容器id 镜像名称
docker container commit e1e0 poiunet/nginx-hello
#### 基础镜像选择原则
1. 尽量选官方的其次是开源的
2. 固定版本tag 不要用latest
3. 选体积小的
#### DockerFile文件编辑指令
dockerfile文件中执行run最好写在一行,可以减少分层从而减少空间。
###### 文件复制命令 copy和add
都可以在复制时创建不存在的目录
add在复制文件时可以解压缩文件
###### workdir 用于目录切换
###### arg和env
可以用来设置变量 ,env设置变量可以设置构建过程和容器内部的变量
arg只能用在构建过程中
###### cmd和entrypoint
CMD可以用来设置容器启动时默认执行的命令
如果docker container run启动容器时制定了其他命令,则CMD命令会被忽略。
如果定义了多个cmd,只有最后一个会被执行
entrypoint 可以设置容器启动时要执行的命令
cmd所设置的命令,可以在docker container run 时传入其他命令覆盖掉cmd命令,但是entrypoint所设置的命令一定会被执行
cmd和entrypoint同时支持shell和exec格式
shell格式 cmd echo "hello docker" entrypoint echo "hello docker"
exec格式 entrypoint ["echo","hello docker"] cmd ["echo","hello docker"]
例:docker container run --rm -it demo-ent echo "hello world"
会打印hello dicker hello world 后加的命令会被当成字符串, 因为entrypoint定义的命令必须被执行
###### 缓存cache
当某一层发生变化后该层以及该层之后的层不能再使用cache,所以可以把经常改变的内容尽量放到后边。
###### dockerignore
设置docker忽略的文件,可以提构建速度,减少发送到后台构建的文件数
##### 多阶段构建
可以as一个有设定环境的镜像,然后从中拷贝出编译好或者需要的文件
##### 构建的注意事项
容器中尽量使用非root用户 (可以自己创建用户)
github上docker-library/official-images中有很多官方dockerfile
##### docker的数据持久化
在运行中的容器里创建的文件,都被保存在一个可写的容器层
docker主要提供两种方式做数据持久化 data volume和bind mount
###### data volume
查看 docker volume ls
查看具体docker volume inspect XXXXXX
```FROM alpine:latest
RUN apk update
RUN apk --no-cache add curl
ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.1.12/supercronic-linux-amd64 \
SUPERCRONIC=supercronic-linux-amd64 \
SUPERCRONIC_SHA1SUM=048b95b48b708983effb2e5c935a1ef8483d9e3e
RUN curl -fsSLO "$SUPERCRONIC_URL" \
&& echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \
&& chmod +x "$SUPERCRONIC" \
&& mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \
&& ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic
COPY my-cron /export/dockercode/my-cron
WORKDIR /export/dockercode
# RUN cron job
CMD ["/usr/local/bin/supercronic", "/export/dockercode/my-cron"]
```
my-cron
```
*/1 * * * * date >> /export/dockercode/test.txt```
构件时用-v参数指定要持久化的目录和持久化到的目录
```
$ docker image build -t my-cron .
$ docker container run -d -v cron-data:/export/dockercode my-cron
43c6d0357b0893861092a752c61ab01bdfa62ea766d01d2fcb8b3ecb6c88b3de
$ docker volume ls
DRIVER VOLUME NAME
local cron-data
$ docker volume inspect cron-data
[
{
"CreatedAt": "2021-06-22T23:25:02+02:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/cron-data/_data",
"Name": "cron-data",
"Options": null,
"Scope": "local"
}
]
$ ls /var/lib/docker/volumes/cron-data/_data
my-cron
$ ls /var/lib/docker/volumes/cron-data/_data
my-cron test.txt
```
###### 环境清理
强制删除所有容器,系统清理和volume清理
```
$ docker rm -f $(docker container ps -aq)
$ docker system prune -f
$ docker volume prune -f
```
### docker网络
创建执行命令的容器
```
docker container run -d --rm --name box1 busybox /bin/sh -c "while true; do sleep 3600; done"
```
docker network ls 可以看到docker提供的网络模式
docker network inspect 加网络模式的Id
可以看到网络模式的详细信息
建立网络驱动 docker network create -d bridge mybridge
容器指定网络驱动 --network XXX驱动名
docker container run -d --rm --name box2 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done"
容器增加网络
docker network connect bridge box3
容器关闭网络
docker network disconnect bridge box3
```
docker container run -d --rm --name box1 busybox /bin/sh -c "while true; do sleep 3600; done"
```
docker network ls 可以看到docker提供的网络模式
docker network inspect 加网络模式的Id
可以看到网络模式的详细信息
创建网络
docker network create -d bridge mybridge
默认的docker0网络不提供名字互ping
指定网段
docker network create -d bridge --gateway 172.200.0.1 --subnet 172.200.0.0/16 XXX名字
查看容器配置中的IP地址
docker container inspect --format '{{.NetworkSettings.IPAddress}}' XXX
```
WARNING: IPv4 forwarding is disabled. Networking will not work.解决方法
```
修改文件
vim /etc/sysctl.conf
添加或修改
#配置转发
net.ipv4.ip_forward=1
修改完
#重启服务,让配置生效
systemctl restart network
#查看是否成功,如果返回为“net.ipv4.ip_forward = 1”则表示成功
sysctl net.ipv4.ip_forward
```
linux命令查看iptables配置
```iptables -t nat -nvxL
iptables -t nat -nvxL
```
dockerfile 中EXPOSE只是起到说明的作用 ,并不影响使用-p来映射端口
host类型网络创建容器时可以用--network host 指定
host类型可以使容器和主机共享同一网络,容器的端口就是本机的端口,这类容器只能启动一个
none类型网络表示没有网络,docker不创建网络,需要用户再创建
docker compose 安装
```
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```
如果访问失败用
```
curl -L https://get.daocloud.io/docker/compose/releases/download/v2.4.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
```
将可执行权限应用于二进制文件:
```
sudo chmod +x /usr/local/bin/docker-compose
```
测试是否安装成功:
```
docker-compose version
Docker Compose version v2.4.1
```
相关推荐
狂神docker笔记(超详细) 1:docekr进阶 2: docker基础入门 都是自己亲自看着bilibili上学习敲打的,还标注了一些,然后还有一些自己的err的解决方法
狂神Docker笔记,相对来说比较全面 狂神Docker笔记,相对来说比较全面 狂神Docker笔记,相对来说比较全面
根据阳哥docker笔记, 和狂神说笔记,自己记的
咱也是下载的别人的,感觉还行,分享给大家。
狂神docker教学视频笔记,截图标注很全(本人增加了很多额外的标注),帮助更好理解,敲了很久,实在不易。上传来帮助大家学习,一方面攒点积分!
Docker笔记 B站狂神
docker笔记笔记笔记笔记笔记笔记
docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,docker学习笔记,...
超级详细的docker笔记 b站狂神说,超级详细的docker笔记 b站狂神说,超级详细的docker笔记 b站狂神说,超级详细的docker笔记 b站狂神说,
"Docker笔记" Docker是一种轻量级的操作系统虚拟化工具,能够使应用程序与基础设施相隔离,提供了一个高效、轻量级的虚拟化解决方案。下面是Docker笔记的详细知识点: 一、Docker安装 Docker的安装非常简单,只...
里面有pdf和word两个版本
docker笔记
学习docker时看到的学习笔记
黑马Docker课程文档笔记
B站狂神说java的docker笔记md转pdf版本,全部笔记