docekr配置

docker换源

1
2
3
4
5
6
7
8
9
#输入命令,创建daemon.json文件
vim /etc/docker/daemon.json
#在编辑器中输入内容,并保存退出
{
"registry-mirrors": ["https://nddt8zfh.mirror.aliyuncs.com"]
}
#输入命令,重启docker即可
systemctl daemon-reload
systemctl restart docker

docker环境调试

1
2
3
4
5
6
7
version: '2'
services:
weblogic:
image: vulhub/weblogic
ports:
- "7001:7001"#映射的端口docekr
- "8453:8453"

继续

1
2
3
4
apt-get update
apt-get install vim

使用docker exec -it e0 /bin/bash命令进入容器,对root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh文件中,如下图处添加debugFlag="true"和export debugFlag两条内容

完成后使用命令使其内配置文件生效

1
docker restart 容器id

image-20210115204525328

镜像命令

推送镜像

1
docker commit -m='提交描述信息' -a='作者' containerID 目标镜像名:[tag]
1
2
3
4
5
6
7
8
9
10
11
12
root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker ps -aq
d315457cf985

root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker commit -m='提交描述信息' -a='作者' d3 anztest
sha256:88dead12e1e2f1647742dc7f507d45ab50e7c9d9754ad9ded98a4196841feea2

root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
anztest latest 88dead12e1e2 5 seconds ago 231MB
445 latest de3ccd0622dc 19 hours ago 2.46GB
centos latest 5d0da3dc9764 18 months ago 231MB
vulhub/weblogic 10.3.6.0-2017 7d35c6cd3bcd 5 years ago 2.46GB
1
2
3
4
5
6
7
docker images
#REPOSITORY TAG IMAGE ID CREATED SIZE
#仓库 标签 镜像ID 创建时间 镜像大小

-a 显示全部镜像
-f 添加过滤器
-q 仅显示id

镜像搜索

1
2
3
4
docker search *
可选项,通过star来过滤
-f
--filter STARS=3000

image-20230405234624760

镜像下载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
docker pull mysql
Using default tag: latest #不写tag,默认下载latest最新版
latest: Pulling from library/mysql
a076a628af6f: Pull complete#分层下载 docker image核心联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
Digest: sha256:0fd2898dc1c946b34dceaccc3b80d38b1049285c1dab70df7480de62265d6213 #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest #真实地址

docker pull mysql
docker pull docker.io/library/mysql:latest #等价

联合文件系统:
将一整个文件进行分块,已经存在的文件块就不再重复下载

镜像删除命令

1
2
3
4
5
6
7
8
docker rmi -f ID
#删除指定镜像

docker rmi -f ID1 ID2
#删除多个镜像

docker rmi -f $(docker images -aq)
#删除全部镜像

容器命令

有镜像才可以创建容器

1
docker pull centos
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
docker run [可选参数] image

#可选参数说明
--name='Name' 用来区分容器
-it 使用交互方式运行,需指定交互 shell
# docker run -it centos /bin/bash
-d 后台方式运行
-p 指定端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口*
-p 容器端口 指定容器端口,主机端口随机
-P 随即指定主机和容器端口


systemctl start docker
systemctl stop docker

docker version
#显示docker版本信息

docker info
#显示docker的系统信息,包括镜像和容器数量

docker 命令 --help

docker-compose up -d

docker-compose build 重新加载环境

docker-compose stop 停止但不删除创建的任何内容
docker-compose down 是停掉容器然后删除掉

docker ps:列出运行中的容器
docker ps #列出当前运行容器
-a #列出所有容器 正在运行+历史运行
-n=3 #只显示最近创建的3个容器

docker run -d centos

#问题docker ps发现centos停止了
常见的坑:docker容器使用后台运行,就必须有一个前台进程,否则docker发现没有应用,会自动停止
比如:nginx 容器启动后,发现自己没有提供服务,就会立即停止


docker stop 容器id:停止容器

docker kill 容器id:强制停止进程中的容器

docker start 容器id:启动已停止的容器

#使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
docker inspect 容器id

docker stats查看cpu状态
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
9eb4ebb6c6a1 nginx01 0.00% 3.766MiB / 1.796GiB 0.20% 5.96kB / 8.25kB 3.32MB / 4.1kB 2


docker container logs 容器id:查看容器日志
docker logs
#显示日志
-tf 显示日志
--tail number 要显示日志的条数
docker logs -tf --tail 10 containerID


docker top 容器id:查看容器里的进程

docker cp 容器id:/root ./目标文件夹/weblogic_jars #复制文件到主机

docker exec -it 容器id /bin/bash:进入容器
exit:退出容器

docker rm 容器ID
#删除指定容器,不能删除正在运行容器 加-f强制删除

docker rm -f ID1 ID2
#删除多个容器

docker rm -f $(docker ps -aq)
docker ps -a -q|xargs docker rm
#删除全部容器

数据卷操作

类似于一个本地云备份,可以实现本地与docker共享数据,数据卷的生命周期一直持续到没有容器使用为止,一旦持久化到本地,本地数据不会删除

1
2
3
docker volume create edc-nginx-vol // 创建一个自定义容器卷
docker volume ls #查看所有容器卷
docker volume inspect 卷名 #查看指定容器卷详情信息

image-20230405235657355

1
2
3
4
5
6
7
8
9
10
11
12
13
docker run -it -v 主机目录:docker目录  #数据卷挂载

#docker inspect 容器id 查看挂在情况
# "Mounts": [
{
"Type": "bind",
"Source": "/root/test", #主机内地址
"Destination": "/home", #docker地址
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]

比如安装mysql,连接本地的2444端口mysql

1
2
3
4
5
6
7
docker run -d -p 2444:3306 -v /root/test/conf:/etc/mysql/conf.d -v /root/test/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql

-d 后台运行 down
-p 指定端口 port
-e 环境配置 environment
-v 卷挂载 volume
--name 容器名

如果 mysql 容器被删除,因为是同步的所以本地数据依然存在

1
2
3
4
5
6
7
8
9
10
11
12
匿名
docker run -d -v /etc --name anouy centos
b0d9271dd4b0f271facac5a622ef1cf7e46d965d1de29e8a3792dd62e735b0be
#-v 加了一个值,代表容器内目录,没有写容器外目录

docker volume ls
DRIVER VOLUME NAME
local 0b92ae7f6a7ec6348a49752db76ace42ec4a465f74cda6222124d01d1c6ef909

root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# ls /var/lib/docker/volumes
0b92ae7f6a7ec6348a49752db76ace42ec4a465f74cda6222124d01d1c6ef909 backingFsBlockDev dockertest metadata.db
#所有docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxx/_data

具名

1
docker run -d -v detailed-centos:/etc --name detailed-centos centos

挂载权限操作

1
2
3
4
5
6
通过 -v 容器内路径:ro   rw更改读写权限
ro readonly 只读
rw readwrite 可读可写

#设置权限后,容器挂载出来就有限制了
ro 容器内部无法操作,只能宿主机操作
1
2
3
4
5
6
--volumes-from 容器ID

docker run --volumes-from cc4ba081cb71 -it centos
#去会继承 cc4ba081cb71 的卷,他们的卷之间是共享同步的
#如果删除 cc4ba081cb71 不影响继承的子
#此时 cc4ba081cb71 就叫数据卷容器

image-20210117135706770

创建镜像时挂载可以使用dockerfile ,还可以手动-v挂载镜像

dockerfile编写

可以通过编写dockerfile文件来创建一个docker镜像

通识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM 指定基础镜像
MAINTAINER 指定维护者
RUN 镜像构建时需要运行的命令,会在docker build时运行
ADD 具体步骤,add指令和copy指令格式一致
WORKDIR 镜像的工作目录
VOLUME 挂载的目录
EXPOSE 保留端口位置
CMD 指定容器启动时要运行的命令,但是只有最后一个会生效,在docker run时运行
ENTRYPOINT 指定容器启动时要运行的命令,会直接追加命令
COPY 类似于ADD,把文件拷贝到镜像中
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

ONBUILD 该dockerfile文件被当作某个镜像的构建基础时触发
ENV 设置环境变量
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dockerfile:
FROM centos
CDM ["ls","-a"]

#ls -a会被整体替换
[root@izbp1i7e0dqxcb89vkdgc3z test]# docker run 358b9081be07 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.
[root@izbp1i7e0dqxcb89vkdgc3z test]# docker run 358b9081be07 ls -l
total 48
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 340 Jan 17 08:07 dev
drwxr-xr-x 1 root root 4096 Jan 17 08:07 etc
drwxr-xr-x 2 root root 4096 Nov 3 15:22 home
lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------ 2 root root 4096 Dec 4 17:37 lost+found
drwxr-xr-x 2 root root 4096 Nov 3 15:22 media

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM centos
VOLUME ["volume1","volume2"]
MAINTAINER anz

ENV MYPATH /usr/local
WORKDIR $MYPATH
#默认工作目录是 根目录

RUN yum -y install vim

EXPOSE 80

CMD echo $MYPATH
CMD /bin/bash
1
2
3
4
5
docker build -f ./dockerfile -t centos:dockerfile .
-t 指定要构建的镜像名称和标签
. 指定构建上下文路径,Docker将在当前目录查找构建所需要文件

docker history images -id 查看安装过程

docker网络

每启动一个Docker容器,docker就会给一个容器分配一个ip,我们只要安装了docker,就会有个网卡docker0桥接模式,它使用的是evth-pair技术

evth-pair技术就是一对虚拟设备接口,成对出现,一端连着协议,一端彼此相连充当一个桥梁,连接虚拟网络

这样物理机和容器,容器和容器都可以互相ping通

image-20210118194723172

1
2
3
4
5
[root@izbp1i7e0dqxcb89vkdgc3z ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
36e3dbde727f bridge bridge local
a4be1eae4e1a host host local
bdf237354def none null local

有四种基本配置:

  • bridge桥接docker默认
  • none不配置网络
  • host和宿主机共享网络
  • container 容器网络联通

-link

就是在hosts配置中增加一个ip containerID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@9559c91ca761 /]# ping centos03
ping: centos03: Name or service not known //在centos02中不能直接pingcentos03

root@xiaoni-01:~# docker run -dit -P --name centos04 --link centos03 centos:7 //进行连接
581451397c27245af4152c7c27f96bc5bf15c097629c424f7fccbe1d9de922ac
root@xiaoni-01:~# docker exec -it 581451397c272 ping centos03 //直接ping
PING centos03 (172.17.0.2) 56(84) bytes of data.
64 bytes from centos03 (172.17.0.2): icmp_seq=1 ttl=64 time=0.076 ms
64 bytes from centos03 (172.17.0.2): icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from centos03 (172.17.0.2): icmp_seq=3 ttl=64 time=0.063 ms
64 bytes from centos03 (172.17.0.2): icmp_seq=4 ttl=64 time=0.067 ms
64 bytes from centos03 (172.17.0.2): icmp_seq=5 ttl=64 time=0.058 ms
64 bytes from centos03 (172.17.0.2): icmp_seq=6 ttl=64 time=0.050 ms
64 bytes from centos03 (172.17.0.2): icmp_seq=7 ttl=64 time=0.057 ms

docker network create

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker network ls
NETWORK ID NAME DRIVER SCOPE
7ef9de74f024 apache_parsing_vulnerability_default bridge local
825caa6e1421 bridge bridge local
e24100408c9c host host local
e24244137196 none null local

root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 anznet
ce79bc46bd85274027d5f1bd02376c8b8a926e18a29b3bafbb1be360b44ce007

root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker network ls
NETWORK ID NAME DRIVER SCOPE
ce79bc46bd85 anznet bridge local
7ef9de74f024 apache_parsing_vulnerability_default bridge local
825caa6e1421 bridge bridge local
e24100408c9c host host local
e24244137196 none null local

root@ubuntu:/home/anz/vulhub-master/weblogic/CVE-2017-10271# docker network inspect anznet
[
{
"Name": "anznet",
"Id": "ce79bc46bd85274027d5f1bd02376c8b8a926e18a29b3bafbb1be360b44ce007",
"Created": "2023-04-06T03:45:00.091772282-07:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
1
docker exec -it 容器id cat /etc/hosts

容器加入自定义网络

1
2
3
docker run -d -P --name 容器指定名字 --net 指定自定义网络 指定使用的镜像
docker run -d -P --name centos1 --net anznet centos
# run启动时不加 net 参数,默认值就是 bridge