0%

周谈(19)-docker基础

前言

平常每周都会有一些心得感悟,这些在大家工作中可能会有许多共性。我觉得花一些时间整理一下,跟粉丝读者们分享一下日常学习工作的想法和所得,这是一个很好的互动和文章分享的痛点。

这是第十九篇。

最近有几次把虚拟机给搞死了,浪费了时间又重新安装了虚拟机。就是我在编译GmSSL这个库的时候,按默认的编译成动态库的话,他会替换系统自带的openssl.so,然后重启的时候,系统就嗝屁了。好像是找不到正确的版本依赖了。GmSSL内部自己依赖了一个openssl的版本,直接把系统的so替换了,应该是版本不兼容导致启动失败的。

嗯,然后就想着搞个docker容器来作实验,花了点时间看了一下docker。

docker

基本原理

docker和虚拟机都是虚拟化的产物。但是虚拟机本身自带了操作系统,操作系统会额外消耗资源。虚拟机完全虚拟化了一套虚拟的资源出来使用。而docker的容器更加轻量级,启动也更快。docker容器共用宿主机的操作系统,不需要额外的消耗。在同样的资源下,容器更加方便、轻量,能够运行更多的实例。

安装

docker是一个虚拟化的平台,通过docker可以管理镜像,然后通过镜像可以创建容器。镜像就相当于类模板,而容器就是模板的一个实例,基于同一个镜像可以创建多个容器。不同的容器有特定的ID后者名称来定位区分。当然,镜像也有镜像的ID和名称、标签来区分。

1
2
wget -qO- https://get.docker.com/ | sh
usermod -aG docker keep

直接运行就可以安装了。

pull镜像

安装之后,需要从仓库pull镜像,镜像由不同的组织上传,提供不同的应用。

1
2
3
4
5
6
7
8
9
10
11
12
root@keep-VirtualBox:/etc/docker# docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
8527c5f86ecc: Pull complete
Digest: sha256:2a7dffab37165e8b4f206f61cfd984f8bb279843b070217f6ad310c9c31c9c7c
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
root@keep-VirtualBox:/etc/docker#
root@keep-VirtualBox:/etc/docker# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3f4714ee068a 28 hours ago 77.8MB

运行容器

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

root@keep-VirtualBox:/etc/docker# docker container run -it ubuntu /bin/bash
root@438ebf3447a6:/#
root@438ebf3447a6:/#


# Ctrl + PQ 退出容器, 容器依旧在运行

root@438ebf3447a6:/# root@keep-VirtualBox:/etc/docker#
root@keep-VirtualBox:/etc/docker#
root@keep-VirtualBox:/etc/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
438ebf3447a6 ubuntu "/bin/bash" 2 minutes ago Up 2 minutes naughty_thompson
root@keep-VirtualBox:/etc/docker#


# 连接回容器

root@keep-VirtualBox:/etc/docker# docker exec -it 438ebf3447a6 bash
root@438ebf3447a6:/#
root@438ebf3447a6:/#

# 停止容器
root@keep-VirtualBox:/etc/docker# docker stop naughty_thompson

naughty_thompson
root@keep-VirtualBox:/etc/docker#
root@keep-VirtualBox:/etc/docker# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@keep-VirtualBox:/etc/docker# docker ps -a // -a 列出所有容器 包括停止的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
438ebf3447a6 ubuntu "/bin/bash" 6 minutes ago Exited (137) 17 seconds ago naughty_thompson
root@keep-VirtualBox:/etc/docker#

# 删除容器
root@keep-VirtualBox:/etc/docker# docker rm naughty_thompson
naughty_thompson
root@keep-VirtualBox:/etc/docker# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@keep-VirtualBox:/etc/docker#

# 一直运行 退出自动重启
root@keep-VirtualBox:/etc/docker# docker container run --name auto-restart -it --restart always ubuntu sleep 10

容器文件存储

多个容器要共享数据的话,可以创建一个卷, 然后运行时分别挂载这个卷,这样大家都可以访问数据了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

root@keep-VirtualBox:~# docker container run -dit --name voltainer --mount source=myvol,target=/vol ubuntu
root@keep-VirtualBox:~# docker exec -it voltainer bash
root@c04fd0703202:/#
root@c04fd0703202:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 98G 53G 41G 57% /
tmpfs 64M 0 64M 0% /dev
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
shm 64M 0 64M 0% /dev/shm
/dev/sda5 98G 53G 41G 57% /vol
tmpfs 3.9G 0 3.9G 0% /proc/asound
tmpfs 3.9G 0 3.9G 0% /proc/acpi
tmpfs 3.9G 0 3.9G 0% /proc/scsi
tmpfs 3.9G 0 3.9G 0% /sys/firmware
root@c04fd0703202:/# cd /vol/
root@c04fd0703202:/vol# ls
root@c04fd0703202:/vol#
root@c04fd0703202:/vol# touch test.file
root@c04fd0703202:/vol# vi test.file

创建的卷默认路径在 /var/lib/docker/volumes/下面,我们进去在_data下就可以看到创建的文件test.file了。

1
2
3
4
5
6
7
8
9
root@keep-VirtualBox:/# cd /var/lib/docker/volumes/
root@keep-VirtualBox:/var/lib/docker/volumes#
root@keep-VirtualBox:/var/lib/docker/volumes# ls
backingFsBlockDev metadata.db myvol
root@keep-VirtualBox:/var/lib/docker/volumes# cd myvol/_data/
root@keep-VirtualBox:/var/lib/docker/volumes/myvol/_data# ls
test.file
root@keep-VirtualBox:/var/lib/docker/volumes/myvol/_data#

容器运行的基础操作就这些, 后面还有更高级的功能待学习。

问题

下载image超时

1
2
3
4
5
6
7
8
9
10
11
root@keep-VirtualBox:~/docker_repo# docker pull ubuntu:latest

Error response from daemon: Head "https://registry-1.docker.io/v2/library/ubuntu/manifests/lastest": net/http: TLS handshake timeout

# docker默认的源为国外官方源,下载速度较慢,需修改docker镜像源为国内

# 修改 /etc/docker/daemon.json 不存在则创建文件,并增加内容:

{
"registry-mirrors":["https://pee6w651.mirror.aliyuncs.com"]
}

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。

博客地址: https://fishmwei.github.io/
掘金主页: https://juejin.cn/user/2084329776486919