docker创建/启动容器方式

Docker给我们提供创建容器的方式也有好几种,包括
1.docker run命令、
2.Dockerfile文件、
3.docker-compose
4.使用runC创建容器

本机情况环境采集:

[root@ht5 ~]# docker version
Client:
 Version:    18.03.0-ce
 API version:    1.37
 Go version:    go1.9.4
 Git commit:    0520e24
 Built:    Wed Mar 21 23:09:15 2018
 OS/Arch:    linux/amd64  //安装平台,默认时出错.应该是x86
 Experimental:    false
 Orchestrator:    swarm  //docker集群工具
Server:
 Engine:
  Version:    18.03.0-ce
  API version:    1.37 (minimum version 1.12)
  Go version:    go1.9.4
  Git commit:    0520e24
  Built:    Wed Mar 21 23:13:03 2018
  OS/Arch:    linux/amd64
  Experimental:    false

[root@ht5 ~]# docker info
Containers: 27
 Running: 16
 Paused: 0
 Stopped: 11
Images: 69
Server Version: 18.03.0-ce
Storage Driver: overlay2
 Backing Filesystem: xfs //这里是可以变更的
 Supports d_type: false   //ftype设置
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs  //隔离资源结合namespace使用
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: cfd04396dc68220d1cecbe686a6cc3aa5ce3667c
runc version: 4fc53a81fb7c994640722ac585fa9ca548971871
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-1160.42.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.65GiB
Name: ht5.node
ID: BGK3:6SSW:KQ56:JJTE:FUYP:RQKJ:37C5:AIXY:UEQM:FJIV:ZUFY:5527
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: overlay2: the backing xfs filesystem is formatted without d_type support, which leads to incorrect behavior.
         Reformat the filesystem with ftype=1 to enable d_type support.
         Running without d_type support will not be supported in future releases.
本机有几个问题:
1.ftype没有设置
2.amd64架构选择错误

本机的docker-ce(开源版本)安装之后的docker工具

docker
docker-containerd
docker-containerd-ctr
docker-containerd-shim 
dockerd
docker-init
docker-proxy
docker-runc
container-storage-setup 

方式一:docker run命令方式

$docker run --name mycreate-nginx -p 1080:80 -v /usr/local/src/nginxcon:/usr/share/nginx/html -d nginx

参数说明:
--name:定义容器名。
-p:宿主机与容器的端口挂载,格式:宿主机端口:容器内部端口
-v:宿主机目录与容器内目录映射,格式:宿主机目录:容器内部目录
-d:后台执行
这里把容器名取名为mycreate-nginx,把容器的80端口映射到宿主机的1080端口,
容器内的/usr/share/nginx/html目录映射到宿主机的/user/local/src/nginxcon目录,
使用的是nginx最新的镜像,镜像部分也可以写成 “nginx:版本”比如“nginx:1.15.1”。
我们来实际运行下,从下面可以清晰的看到,如果本地仓库即docker images列出的本地镜像没有,则从远程拉取

[root@ht5 src]# docker run --name mycreate-nginx -p 1080:80 -v /usr/local/src/nginxcon:/usr/share/nginx/html -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
1fe172e4850f: Pull complete
35c195f487df: Pull complete
213b9b16f495: Pull complete
a8172d9e19b9: Pull complete
f5eee2cb2150: Pull complete
93e404ba8667: Pull complete
Digest: sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4b6fe79ce37b3d199097
Status: Downloaded newer image for nginx:latest
222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76

[root@ht5 src]# netstat -anlp | grep 1080
tcp6 0 0 :::1080 :::* LISTEN 79275/docker-proxy

[root@ht5 src]# ps -ef | grep docker

root      79275   1384  0 23:13 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 1080 -container-ip 172.17.0.3 -container-port 80

//上面即创建一个容器,同时对外暴露端口,通过docker-proxy代理,提供1080访问,宿主机上执行 curl http://localhost:1080/ 访问容器内的80端口

增加参数可以改变容器分配的cpu和内存,io等资源的设置

  -cpu-shares 数字 //如果想为cpu制定不同的权重
--cpuset-cpus 设置容器使用的cpu内核 --cpu-period是用来指定容器对于cpu的使用要在多长时间内重新分配一次(1000000(1秒)) --cpu-quota是用来指定在这个周期内,最多可以有多少时间跑这个容器(2000000.2秒)) 与--cpu-shares(权重)不同的是,这种配置指定一个绝对值,容器对cpu资源使用绝对不会超过配置的值。 当然,在多核情况下,如果允许容器进程完全占用两个cpu,则可以将cpu-period设置为100000(0.1秒),cpu-quota设置为200000(0.2秒) -cpuset-cpus 0-7#执行以下命令需要宿主机为8核,表示创建的容器只能使用0-7 8个内核,最终生成cgroup的cpu内核配置如下: //如果不设置,默认就是0-7 [root@ht5 ~]# cat /sys/fs/cgroup/cpuset/cpuset.cpus 0-7
-m或–memory设置内存的使用限额 例如:-m 100M --memory-swap=200M
--vm 1 ,代表启动一个内存工作线程
--vm-bytes 100M ,代表每个线程可以分配100M内存
–blkio-weight参数可以改变容器block IO的优先级。例如:--blkio-weight 300

docker cgroup 开启启动的查看(比较两台机器的开启启动情况)

[root@ht5 ~]# cat /var/log/dmesg | grep cg
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] allocated 134217728 bytes of page_cgroup
[    0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups  //有时候可能这里会出现内存泄漏的情况
[    0.193565] Initializing cgroup subsys memory
[    0.193579] Initializing cgroup subsys devices
[    0.193580] Initializing cgroup subsys freezer
[    0.193581] Initializing cgroup subsys net_cls
[    0.193583] Initializing cgroup subsys blkio  //Cgroup中的blkio子系统的主要功能是实现对磁盘i/o带宽的定制化控制
[    0.193584] Initializing cgroup subsys perf_event
[    0.193594] Initializing cgroup subsys hugetlb
[    0.193598] Initializing cgroup subsys pids
[    0.193605] Initializing cgroup subsys net_prio
//这里采集一台没有安装docker的机器,所以cgroup是系统的特性.
[root@fp-mysql-13 fs]# cat /var/log/dmesg | grep cg
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu

  [ 0.000000] Initializing cgroup subsys cpuacct
  [ 0.000000] allocated 536870912 bytes of page_cgroup
  [ 0.000000] please try 'cgroup_disable=memory' option if you don't want memory cgroups
  [ 0.037518] Initializing cgroup subsys memory
  [ 0.037539] Initializing cgroup subsys devices
  [ 0.037540] Initializing cgroup subsys freezer
  [ 0.037541] Initializing cgroup subsys net_cls
  [ 0.037543] Initializing cgroup subsys blkio
  [ 0.037544] Initializing cgroup subsys perf_event
  [ 0.037548] Initializing cgroup subsys hugetlb

docker cgroup目录下的变化(安装docker使用cgroups和没有使用cgroups机器的比较)

//cgroups工作目录 /sys/fs/cgroup
[root@ht5 ~]# cd /sys/fs/cgroup/ [root@ht5 cgroup]# ll total 0 drwxr-xr-x 7 root root 0 Feb 18 17:26 blkio lrwxrwxrwx 1 root root 11 Feb 18 17:26 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Feb 18 17:26 cpuacct -> cpu,cpuacct drwxr-xr-x 7 root root 0 Feb 18 17:26 cpu,cpuacct drwxr-xr-x 5 root root 0 Feb 18 17:26 cpuset drwxr-xr-x 7 root root 0 Feb 18 17:26 devices drwxr-xr-x 5 root root 0 Feb 18 17:26 freezer drwxr-xr-x 5 root root 0 Feb 18 17:26 hugetlb drwxr-xr-x 7 root root 0 Feb 18 17:26 memory lrwxrwxrwx 1 root root 16 Feb 18 17:26 net_cls -> net_cls,net_prio drwxr-xr-x 5 root root 0 Feb 18 17:26 net_cls,net_prio lrwxrwxrwx 1 root root 16 Feb 18 17:26 net_prio -> net_cls,net_prio drwxr-xr-x 5 root root 0 Feb 18 17:26 perf_event drwxr-xr-x 7 root root 0 Feb 18 17:26 pids //这里 drwxr-xr-x 7 root root 0 Feb 18 17:26 systemd //和下面最大的不同就是pids目录的出现memory目录下的变化 [root@fp-mysql-13 fs]# cd /sys/fs/cgroup/ [root@fp-mysql-13 cgroup]# ll total 0 drwxr-xr-x 2 root root 0 Nov 23 15:45 blkio lrwxrwxrwx 1 root root 11 Nov 23 15:45 cpu -> cpu,cpuacct lrwxrwxrwx 1 root root 11 Nov 23 15:45 cpuacct -> cpu,cpuacct drwxr-xr-x 2 root root 0 Nov 23 15:45 cpu,cpuacct drwxr-xr-x 2 root root 0 Nov 23 15:45 cpuset drwxr-xr-x 2 root root 0 Nov 23 15:45 devices drwxr-xr-x 2 root root 0 Nov 23 15:45 freezer drwxr-xr-x 2 root root 0 Nov 23 15:45 hugetlb drwxr-xr-x 2 root root 0 Nov 23 15:45 memory drwxr-xr-x 2 root root 0 Nov 23 15:45 net_cls drwxr-xr-x 2 root root 0 Nov 23 15:45 perf_event drwxr-xr-x 4 root root 0 Nov 23 15:45 systemd

我们查看下上面容器启动的变化:

[root@ht5 docker]# docker ps | grep nginx
222e67a09d9a        nginx    "/docker-entrypoint.…"   10 hours ago        Up 10 hours         0.0.0.0:1080->80/tcp   mycreate-nginx

  [root@ht5 /sys/fs/cgroup/memory/docker]# ll
  total 0
  drwxr-xr-x 2 root root 0 Apr 24 23:13 222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76

 //有变化的地方 

 [root@ht5 memory]# ll  //当前目录为/sys/fs/cgroup/memory
 ...
 drwxr-xr-x 6 root root 0 Apr 24 21:25 docker
 drwxr-xr-x 4 root root 0 Feb 22 10:28 kubepods
 drwxr-xr-x 2 root root 0 Feb 21 21:56 kube-proxy
 drwxr-xr-x 111 root root 0 Apr 24 18:12 system.slice
 drwxr-xr-x 2 root root 0 Feb 18 17:26 user.slice
  ....

 //该容器对应的资源

 [root@ht5 222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76]# ls
 cgroup.clone_children memory.kmem.limit_in_bytes memory.kmem.tcp.usage_in_bytes memory.memsw.max_usage_in_bytes memory.soft_limit_in_bytes tasks
 cgroup.event_control memory.kmem.max_usage_in_bytes memory.kmem.usage_in_bytes memory.memsw.usage_in_bytes memory.stat
 cgroup.procs memory.kmem.slabinfo memory.limit_in_bytes memory.move_charge_at_immigrate memory.swappiness
 memory.failcnt memory.kmem.tcp.failcnt memory.max_usage_in_bytes memory.numa_stat memory.usage_in_bytes
 memory.force_empty memory.kmem.tcp.limit_in_bytes memory.memsw.failcnt memory.oom_control memory.use_hierarchy
 memory.kmem.failcnt memory.kmem.tcp.max_usage_in_bytes memory.memsw.limit_in_bytes memory.pressure_level notify_on_release

 //看下/var/lib/docker下

[root@ht5 222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76]# pwd  //当前目录
/var/lib/docker/containers/222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76

[root@ht5 222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76]# ll
total 28
-rw-r----- 1 root root 3081 Apr 24 23:13 222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76-json.log
drwx------ 2 root root 6 Apr 24 23:13 checkpoints
-rw------- 1 root root 3195 Apr 24 23:13 config.v2.json
-rw-r--r-- 1 root root 1240 Apr 24 23:13 hostconfig.json
-rw-r--r-- 1 root root 13 Apr 24 23:13 hostname
-rw-r--r-- 1 root root 174 Apr 24 23:13 hosts
drwx------ 3 root root 16 Apr 24 23:13 mounts
-rw-r--r-- 1 root root 290 Apr 24 23:13 resolv.conf
-rw-r--r-- 1 root root 71 Apr 24 23:13 resolv.conf.hash

查看比较详细的信息

[root@ht5 overlay2]# docker inspect 222e67a09d9a
[
    {
        "Id": "222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76",
        "Created": "2022-04-24T15:13:19.716327281Z",
        "Path": "/docker-entrypoint.sh",
        "Args": [
            "nginx",
            "-g",
            "daemon off;"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 79297,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-04-24T15:13:20.365642406Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:fa5269854a5e615e51a72b17ad3fd1e01268f278a6684c8ed3c5f0cdce3f230b",
        "ResolvConfPath": "/var/lib/docker/containers/222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76/hostname",
        "HostsPath": "/var/lib/docker/containers/222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76/hosts",
        "LogPath": "/var/lib/docker/containers/222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76/222e67a09d9a83e9649fbe07bb0e54258b1b52a1d355aed74694ead5c758cd76-json.log",
        "Name": "/mycreate-nginx",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": [
                "/usr/local/src/nginxcon:/usr/share/nginx/html"
            ],
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {
                "80/tcp": [
                    {
                        "HostIp": "",
                        "HostPort": "1080"
                    }
                ]
            },
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
//只读层
"LowerDir": "/var/lib/docker/overlay2/e5a85b04886cea66fdebbd420153b29599f4a18b753c9db7edf53bdb3d42de72-init/diff:/var/lib/docker/overlay2/29f10b82508ba9c336b1a04b59e56e8fa02e16c41331108618232965a5500e7e/diff:/var/lib/docker/overlay2/e18f942e47c0de76700f07e4f466a1ea61533251da88af883d44a53cc0911aab/diff:/var/lib/docker/overlay2/4b812095ef67178fea715b49f85a3049a7cc0b7ac4d64b1f356bdbf148e16700/diff:/var/lib/docker/overlay2/c341cf40a78d977bdeed820586fddeeb40eb7509a2d5f966a59ed48239a4827f/diff:/var/lib/docker/overlay2/34dd7d91e749216183020cbbd8b1c6ca5a8502e5242f02c4547d1518e495e1f6/diff:/var/lib/docker/overlay2/230e6fbe9e9c2828da0ae965d6607fb55215bd3977b5af3991a9001bf0f300c4/diff", //联合层
          "MergedDir": "/var/lib/docker/overlay2/e5a85b04886cea66fdebbd420153b29599f4a18b753c9db7edf53bdb3d42de72/merged", //可读写层
          "UpperDir": "/var/lib/docker/overlay2/e5a85b04886cea66fdebbd420153b29599f4a18b753c9db7edf53bdb3d42de72/diff", //diff是差异的地方 "WorkDir": "/var/lib/docker/overlay2/e5a85b04886cea66fdebbd420153b29599f4a18b753c9db7edf53bdb3d42de72/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "bind", "Source": "/usr/local/src/nginxcon", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ], "Config": { "Hostname": "222e67a09d9a", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "NGINX_VERSION=1.21.6", "NJS_VERSION=0.7.2", "PKG_RELEASE=1~bullseye" ], "Cmd": [ "nginx", "-g", "daemon off;" ], "Image": "nginx", "Volumes": null, "WorkingDir": "", "Entrypoint": [ "/docker-entrypoint.sh" ], "OnBuild": null, "Labels": { "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>" }, "StopSignal": "SIGQUIT" }, "NetworkSettings": { "Bridge": "", "SandboxID": "af6ab3988204245873fe9d3022da38d6919659508e9b9087b4e036bce6d1a270", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "1080" } ] }, "SandboxKey": "/var/run/docker/netns/af6ab3988204", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "06c3b917475a61e1805035bbf41c50ed0eb7486a96891b593bbec90e84f5482d", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "1caead2ab69fd0c57f3a39c4ed39cc2fd5859677e822ee682f742181083b93b1", "EndpointID": "06c3b917475a61e1805035bbf41c50ed0eb7486a96891b593bbec90e84f5482d", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:03", "DriverOpts": null } } } } ]
https://docs.docker.com/engine/reference/commandline/inspect/

 容器的网络命名空间名称

[root@ht5 overlay2]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1caead2ab69f        bridge              bridge              local
3cf5406d55f0        host                host                local
bf2d13101b37        none                null                local

[root@ht5 overlay2]# docker inspect -f '{{.NetworkSettings.SandboxKey}}' 222e67a09d9a //容器id
 /var/run/docker/netns/af6ab3988204

方式二:Dockerfile配置文件构建镜像方式

1.创建一个文件,命名为Dockerfile,输入以下内容。
FROM nginx COPY html /usr/share/nginx/html
解释: FROM nginx 代表以nginx 镜像为基础构建我们的镜像。
注意需要先在Dockerfile同目录创建html目录,不然会报错。
Dockerfile文件内可以自定义镜像内容,有很多指令可以用
2.在Dockerfile同目录下运行命令创建镜像
[root@ht5 bin]# docker build -t my-nginx-image .
3.运行容器
docker run --name aozhejin-nginx -p 1080:80 -d my-nginx-image
//Dockerfile一般用于自定义镜像

方式三:docker -compose方式

1.创建一个docker-compose.yml文件,输入以下内容
version: "3"services: nginx: image: nginx container_name: aozhejin-nginx ports: - "1080:80" volumes: - /data/html:/usr/share/nginx/html
在/data/html创建一个index.html,随便输入个内容,等会访问测试。
2.执行启动命令
docker-compose up -d

  

posted @ 2022-04-27 10:54  jinzi  阅读(24730)  评论(0编辑  收藏  举报