Docker容器

Docker实践

2020-01-19  本文已影响0人  QuietHeart

系统相关

$cat /etc/issue
Ubuntu 18.04.1 LTS \n \l

安装配置

$sudo apt-get install docker.io

用户组配置

$sudo gpasswd -a miracle docker
$sudo systemctl docker restart
$pkill X

注:如果不进行如上的用户组配置,那么执行 docker images 的时候就会出现权限的错误。

如下命令同样适用

$sudo systemctl start docker
$sudo systemctl enable docker
$sudo systemctl restart docker

#修改配置文件之后,重启docker服务
$systemctl daemon-reload
$systemctl restart docker.service

注:发现重启之后,已运行的docker容器也退出了。

Docker版本

查看 docker 版本的命令:

$docker -v

Docker仓库相关

Docker仓库的理解参考: 关于Docker仓库

docker search 搜索镜像

$docker search busybox

搜索包含 busybox 的镜像,会有很多,比如

miracle@xmnb4003210:~/misc$ docker search busybox
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
busybox                   Busybox base image.                             1634                [OK]                
progrium/busybox                                                          70                                      [OK]
radial/busyboxplus        Full-chain, Internet enabled, busybox made f…   24                                      [OK]
arm32v7/busybox           Busybox base image.                             7                                       
yauritux/busybox-curl     Busybox with CURL                               5                                       
armhf/busybox             Busybox base image.                             4                                       
arm64v8/busybox           Busybox base image.                             3                                       
......

docker pull 下载镜像

$docker pull busybox

不指定版本号会默认下载 busy:latest ,结果类似如下:

$ docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
ee153a04d683: Pull complete 
Digest: sha256:e3b586a669fae4073bb68b5bcabea26dae469ee6f157050c212c77b50f992d5a
Status: Downloaded newer image for busybox:latest

镜像下载中可以看到是分层下载,每一层都有一个唯一的ID值表示,每层下载的大小实际为该层进行的修改增量。

docker login 登录

$docker login --username=vaqeteart
Password: 
WARNING! Your password will be stored unencrypted in /home/miracle/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

只有登录之后,才能使用 docker push 推送提交的镜像到仓库。使用 docker login 命令直接登陆到 docker hub, 登陆信息均会保存在 $HOME/.docker/config.json 目录下

docker logout 退出

$docker logout
Removing login credentials for https://index.docker.io/v1/

Docker常用操作

docker images 查看本地镜像

$docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               d131e0fa2585        10 days ago         102MB
ubuntu              latest              d131e0fa2585        10 days ago         102MB

docker search 搜索镜像

$ docker search busybox
NAME                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
busybox                   Busybox base image.                             1637                [OK]                
progrium/busybox                                                          70                                      [OK]
radial/busyboxplus        Full-chain, Internet enabled, busybox made f…   24                                      [OK]
arm32v7/busybox           Busybox base image.                             7                                       
yauritux/busybox-curl     Busybox with CURL                               5                           
......

这会搜索所有dockerhub上的镜像。

docker pull 拉取镜像

$docker pull busybox

这会将相应名称的镜像拉取(下载)到本地,拉取之后,便可以运行镜像了。

其它可能的命令类似:

$docker pull ubuntu:latest
或
$docker pull ubuntu:18.04
#或
$docker pull registry.hub.docker.com/ubuntu:latest

docker run 运行镜像

$docker run -it ubuntu:18.04 /bin/bash
root@7b74c9092147:/#

这样就由镜像的运行生成了一个容器,并进入到容器中了。发现,很多命令比如 ifconfig 等都没有。但是可以运行 apt-get install update

docker ps 查看正在运行的容器

$docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7b74c9092147        ubuntu:18.04        "/bin/bash"         3 minutes ago       Up 3 minutes                            angry_spence

注意,使用 docker ps -a 可查看所有状态的容器。

docker exec 进入正在运行的容器

$docker exec -it 7b74c9092147 /bin/bash

这样和使用ssh登录一样,使用 C-D 退出之后也不会导致整个容器退出(注意,这个容器事先必须是已经处于运行的状态),

使用 docker top <容器id> 可以看到,执行exec之后,新多了一个bash进程。

使用exec命令进入容器内部就如同进入另一个机器一样,并且使用exit命令,不会像attach那样导致容器停止,所以非常适合容器内部操作

docker attach 附到正在运行的容器(attach)

$docker attach 7b74c9092147

这样会进入到相应的容器中,如同exec登录一样,但是如果通过 C-d 退出容器的时候,会发现,原来用 docker run -it / docker exec -it 运行的容器也被退出了,并且 docker ps 会发现没有正在运行的容器了,而 docker ps -a 可以看到容器的状态是Exited(130)。退出的方式应该是: C-p C-q

中文意思是附加、贴上、系上等意思,所以dokcer attach主要的作用就是进入容器,这个容器和后面的docker exec类似但是完全不一样。
使用exit命令或者ctrl+C命令是停止容器,退出容器命令可使用ctrl+P,然后使用ctrl+Q命令,即可退出容器的虚拟终端,此时容器还在运行。
官方不推荐使用docker attach命令进入开启了交互模式的容器,docker attach的主要功能是查看信息,容器内部操作有更加方便的docker exec命令,将在稍后介绍。

docker top 查看容器运行的进程

$docker top 7b74c9092147
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7726                7700                0                   16:44               pts/0               00:00:00            /bin/bash
root                8079                7700                0                   16:48               pts/1               00:00:00            /bin/bash

docker stop 停止/退出容器

$docker stop 7b74c9092147

这样会停止容器,同时通过 exec 等进入容器的终端也会退出,使用 docker ps -a 可以看到停止的状态是 Exit(0), 和 docker attach 通过 C-d 或重启机器之后看到的状态Exit(130)类似。

实践发现,对于容器中发现如下三种方式退出后,容器仍为Up或者被停止的情况视 exec 还是 attach 有所不同。

docker start 启动容器

$docker start 7b74c9092147

这样会将 docker ps -a 看到的状态为Exit状态的容器重启起来。

docker restart 重启容器

$docker restart 7b74c9092147

这样会重启容器,相当于 stopstart, 同时通过 exec 等进入容器的终端也会退出。

docker rm 删除容器

$docker rm 7b74c9092147

执行之后,将会在 docker ps -a 中看到相应的容器已经消失。

docker commit 提交容器

可以提交容器,来创建相应的镜像,保存事先操作的环境。

root@71fe2a8636b9:/#exit
$ docker commit -m 'ubuntu with ifconfig/sudo/miracle' -a "vaqeteart" 71fe2a8636b9 vaqeteart/ubuntu:test1
sha256:c2fd07bf051627a437da9a963ad4d06990b7b0e134f2f7e4e3936ad11474d832

注意,先退出容器(71fe2a8636b9)。
其中, -m 指定说明信息; -a 指定用户信息; 71fe2a8636b9 代表容器的id; vaqeteart/ubuntu:vim 指定目标镜像的用户名、仓库名和 tag 信息,运行命令的时候使用自己注册Docker时的用户名。

此时Docker中就有了我们新建的镜像 vaqeteart/ubuntu:test1 ,此镜像和原有的 ubuntu 镜像区别在于多了一些工具。此时我们利用新镜像创建的容器,本身就自带之前提交容器相关的工具了。

可看到相关的镜像

miracle@xmnb4003210:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
vaqeteart/ubuntu    test1               c2fd07bf0516        5 minutes ago       132MB
busybox             latest              db8ee88ad75f        3 months ago        1.22MB
ubuntu              18.04               d131e0fa2585        5 months ago        102MB
ubuntu              latest              d131e0fa2585        5 months ago        102MB

docker push 上传提交的容器/镜像

$docker push vaqeteart/ubuntu:test1
The push refers to repository [docker.io/vaqeteart/ubuntu]
1b0fea03824f: Pushed 
7660ded5319c: Mounted from library/ubuntu 
94e5c4ea5da6: Mounted from library/ubuntu 
5d74a98c48bc: Mounted from library/ubuntu 
604cbde1a4c8: Mounted from library/ubuntu 
test1: digest: sha256:b44733a335979077d46237d826a267176ea9cf1e5e80c1b5914a6277662d2b7b size: 1362

注意,只有事先使用 docker login 登录之后,才能够使用 docker push 推送镜像,没有登录的话,会出现如下失败:

$docker push vaqeteart/ubuntu:test1
The push refers to repository [docker.io/vaqeteart/ubuntu]
1b0fea03824f: Preparing 
7660ded5319c: Preparing 
94e5c4ea5da6: Preparing 
5d74a98c48bc: Preparing 
604cbde1a4c8: Preparing 
denied: requested access to the resource is denied

其它参考

源自:https://www.oschina.net/question/877522_239204

无敌菌君 2015/09/06 15:41
step1——找到本地镜像的ID:docker images
step2——登陆Hub:docker login --username=username --password=password --email=email
step3——tag:docker tag <imageID> <namespace>/<image name>:<version tag eg latest>
step4——push镜像:docker push <namespace>/<image name>
......
 Yashin 2015/06/12 13:07
额,这个看一下文档就行了啊,好简单的,碰到具体问题再来提问比较好
https://docs.docker.com/docker-hub/
评论 (0) 引用此答案 举报
0
......
xue777hua
xue777hua 2015/09/05 13:36
1. 建立一个private的 registry
2. 制作一个image:可以dockerfile,也可以docker commit
3. docker push 即可

docker info 查看docker系统配置信息

$docker info
Containers: 5
 Running: 1
 Paused: 0
 Stopped: 4
Images: 3
Server Version: 18.09.7
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 
runc version: N/A
init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662)
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.15.0-43-generic
Operating System: Ubuntu 18.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 7.343GiB
Name: xmnb4003210
ID: DPEZ:7TCA:W5LW:QFSM:PU7X:5SC6:KXU5:SN4A:VTAS:HBTZ:ZUUJ:EO6D
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: No swap limit support

docker help 帮助信息

查看整体帮助信息:

$docker help

查看具体命令帮助信息:

docker <command> --help
或
docker help <command>

docker volume 数据卷管理

管理数据卷使用 docker volume 命令,数据卷是容器数据持久化的一个组件。其中:

REFERENCE 启动镜像并且创建匿名Volume

$docker run --name test_volume -it  -v /home/miracle/mydata d131e0fa2585  /bin/bash

Volume用于容器/主机数据的管理、共享、与传输等。这里,不能用 docker exec 来进入已有的容器,只能从镜像启动时指定。启动之后,你会发现容器中有 /home/miracle/mydata 这个目录。这里,使用 --name 指定生成的容器名称为 test_volume, 便于后续查看管理。

检查挂载的volume在host主机中的路径

$docker inspect test_volume
.....
        "Mounts": [
            {
                "Type": "volume",
                "Name": "3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90",
                "Source": "/var/lib/docker/volumes/3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90/_data",
                "Destination": "/home/miracle/mydata",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
......

由上可见,容器中的 /home/miracle/mydata 其实是对应了主机中的 /var/lib/docker/volumes/3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90/_data 的,实际操作中,在容器中,或者在主机中进行对该目录的操作(添加删除文件),在容器和主机的对应路径中都会体现出来。

REFERENCE 创建有名Volume并在启动镜像时挂载到容器中

$docker volume create test_volume2
test_volume2
$sudo ls /var/lib/docker/volumes
[sudo] miracle 的密码: 
0b66e301bdab3edcab10ba390aa522dedd5b2dedbf49273f0ca0aa33c71d59bf  metadata.db
3903895feecbf7054d4c0a5ceb00109da6454b5479b31fec3f1c2432af176d90  test_volume2
$docker run --name test_volume2 -it -v test_volume2:/home/miracle/volume2 d131e0fa2585 /bin/bash
$docker inspect test_volume2
......
        "Mounts": [
            {
                "Type": "volume",
                "Name": "test_volume2",
                "Source": "/var/lib/docker/volumes/test_volume2/_data",
                "Destination": "/home/miracle/volume2",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
......

这里,首先使用 docker volume create 创建一个 test_volume2 的volume,然后通过 docker run 将其挂载到容器的 /home/miracle/volume2 目录中,启动之后,我们可以发现,在容器中的 /home/miracle/volume2 对应挂载了主机中的 /var/lib/docker/volumes/test_volume2/_data

REFERENCE 启动镜像的时候将主机中一个目录挂载到容器中

$docker run --name test_mount -it -v /home/miracle/tmpTrans:/home/miracle/tmpTrans d131e0fa2585 /bin/bash

这里, /home/miracle/tmpTrans:/home/miracle/tmpTrans 冒号前面是主机的路径,冒号后面是容器的路径。这样执行之后,你会发现,容器中会创建相应的路径,并将主机中相应的路径挂载进来。

注:使用 docker exec -v xxx 是不行的。主机的路径名一定要是绝对路径或者 ~/xxx 否则会被当成volume挂载。这个方式依赖主机的目录结构,所以可以移植性不如前面volume的方式。

其它

更多学习参考: Docker实践

实践尝试

重启宿主机之后容器停止,重新启动容器数据仍在

使用 docker exec -it <id> /bin/bash 进入容器之后,再 C-d 退出,发现 docker ps 容器仍旧在运行。

docker ps 发现有运行的容器之后,重启机器,会发现 docker ps 没有运行的容器了,但是 docker ps -a 会有Exit的容器。

重启机器后, docker start <id> 会启动之前的容器,并且使用 docker exec -it <id> /bin/bash 会发现之前创建的文件仍在。

上一篇下一篇

猜你喜欢

热点阅读