Docker是什么
一种容器技术,基于Go语言实现
目标:“Build,Ship and Run Any App ,Anywhere”
一次封装到处运行
Docker为什么出现
开发与运维的鸿沟 避免由于环境不同而产生的矛盾 减少运维的工作量
Docker解决了什么问题
解决了运行环境和配置问题,方便做持续集成,有助于整体发布
Docker 版本:DockerCE(社区版) DockerEE(企业版)
Docker能干什么
Docker与传统的虚拟化技术差异(Vmware)
虚拟化技术就是虚拟了整套环境 ,必须有自己的操作系统
缺点:资源占用多、启动慢
而docker 容器不必有自己的操作系统而是通过 dockerEngin 来访问宿主机的系统。所以效率高很多
安装
CentOSD7.6 环境下 直接运行 yum install docker-ce 即可完成 docker 安装
或者通过如下步骤
1.#安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2.#配置yum源 使用国内的
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3.#查看版本
yum list docker-ce --showduplicates | sort -r
4.选择其中一个 进行安装docker
yum -y install docker-ce-20.10.10-3.el7
镜像加速
Docker 中国官方镜像加速可通过 registry.docker-cn.com 访问。配置完成下载镜像速度会更快。
配置方法:修改/etc/docker/daemon.json 文件,并添加上 registry-mirror ,如下:
[root@zk01 ~]# cd /etc/docker/
[root@zk01 docker]# ll
总用量 20
drwxr-xr-x. 5 root root 75 2月 16 23:04 certs.d
-rw-r--r--. 1 root root 3 3月 12 2019 daemon.json
-rw-------. 1 root root 244 2月 16 23:04 key.json
-rw-r--r--. 1 root root 10837 3月 12 2019 seccomp.json
[root@zk01 docker]# vi daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
可以配置阿里云镜像。登录阿里云进入个人中心搜索容器镜像服务
进入服务 找到 加速地址 并配置到上述文件中
帮助命令
docker version 查看版本
docker info 查看docker状态信息
docker --help 查看命令帮助信息
[root@zk01 docker]# docker version
Client:
Version: 1.13.1
API version: 1.26
Package version: docker-1.13.1-94.gitb2f74b2.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Tue Mar 12 10:27:24 2019
OS/Arch: linux/amd64
Server:
Version: 1.13.1
API version: 1.26 (minimum version 1.12)
Package version: docker-1.13.1-94.gitb2f74b2.el7.centos.x86_64
Go version: go1.10.3
Git commit: b2f74b2/1.13.1
Built: Tue Mar 12 10:27:24 2019
OS/Arch: linux/amd64
Experimental: false
[root@zk01 docker]# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.13.1
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: journald
Cgroup Driver: systemd
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: docker-runc runc
Default Runtime: docker-runc
…
镜像命令
docker images 查看本地镜像 参数 -a 列出所有镜像 -q只显示镜像id --digests 显示摘要信息 --no-trunc
cocker search +镜像名 从远程资源库中查找镜像
docker pull +镜像名 从资源库中下载镜像到本地
docker rmi 镜像id 从本地删除镜像
删除单个 docker rmi -f 镜像名
删除多个 docker rmi 镜像名1:tag1 镜像名2:tag2
删除全部 docker rmi -f $(docker images -q)
如下实例:
//查看本地镜像 发现本地没有镜像
[root@zk01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
在资源库中查找 redis 镜像
[root@zk01 docker]# docker search redis
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/redis Redis is an open source key-value store th... 6781 [OK]
docker.io docker.io/bitnami/redis Bitnami Redis Docker Image 111 [OK]
docker.io docker.io/sameersbn/redis 76 [OK]
下载redis镜像到本地
[root@zk01 docker]# docker pull docker.io/redis
Using default tag: latest
Trying to pull repository docker.io/library/redis ...
latest: Pulling from docker.io/library/redis
27833a3ba0a5: Downloading [============>
下载helloworld镜像
[root@zk01 docker]# docker pull hello-world
Using default tag: latest
Trying to pull repository docker.io/library/hello-world ...
latest: Pulling from docker.io/library/hello-world
1b930d010525: Pull complete
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Status: Downloaded newer image for docker.io/hello-world:latest
再次查看镜像发现本地有我们刚下载的镜像
[root@zk01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/redis latest a55fbf438dfd Less than a second ago 95 MB
docker.io/hello-world latest fce289e99eb9 6 weeks ago 1.84 kB
根据id删除 helloworld镜像
[root@zk01 docker]# docker rmi fce289e99eb9
Untagged: docker.io/hello-world:latest
Untagged: docker.io/hello-world@sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3
[root@zk01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/redis latest a55fbf438dfd Less than a second ago 95 MB
容器命令
首先总结下容器和镜像的概念:
容器相当于tomcat 运行起来的状态。镜像就相当于下载的tomcat包。一个tomcat包可以同时运行在多个进程中(修改端口启动两次就可以运行多个tomcat进程)。
docker run 命令
格式 docker run [options] image [command] [ARG…]
options:–name 为容器指定一个新名称 -d 后台运行容器 -i交互方式运行 -t 启动一个伪终端 -p 指定端口映射 -P随机端口映射
我们可以通过 docker run 命令在 运行我们的 redis镜像。如下 redis 启动后直接输出了redis日志 ,如果想让redis镜像在后台启动,可以加参数-d
[root@zk01 docker]# docker run --name myredis redis
1:C 16 Feb 2019 16:30:44.138 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 16 Feb 2019 16:30:44.138 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 16 Feb 2019 16:30:44.138 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server
后台启动redis 这里我们同时 将 redis 容器的 6379端口映射到 我们linux(宿主机)的 6479 端口
[root@zk01 docker]# docker run --name myredis -d -p6479:6379 redis
075402aeb280b24cc74a9ebbc991524f97a809378365317d79d1a17e688d3b7e
[root@zk01 docker]#
启动后我们通过 宿主机的 ip+6479 端口就可以访问到 redis 如下图:
docker ps 命令列出所有运行的容器
格式:docker ps [options]
options:-a 列出所有正在运行+历史运行的容器 -l 显示最近创建的容器 -n显示最近创建的N个容器 -q 只显示容器id
docker rm 容器id 删除容器
以下示例显示出我们运行过的redis 容器,并删除容器。镜像run之后,即使又停止了容器仍然会保存在docker中,可以直接启动容器,也可以删除容器重新从镜像 run 启动容器。
[[root@zk01 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7e984457f6c0 redis "docker-entrypoint..." About a minute ago Exited (0) 11 seconds ago myredis
[root@zk01 docker]# docker rm 7e984457f6c0
docker stop 容器id/容器名称 停止正在运行的容器
docker start 容器id/容器名称 重新运行已经停止的容器
docker restart 容器id/容器名称 重新运行正在运行的容器
[root@zk01 docker]# docker stop 075402aeb280
075402aeb280
[root@zk01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zk01 docker]# docker start 075402aeb280
075402aeb280
[root@zk01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
075402aeb280 redis "docker-entrypoint..." 22 minutes ago Up 2 seconds 0.0.0.0:6479->6379/tcp myredis
[root@zk01 docker]# docker restart 075402aeb280
075402aeb280
[root@zk01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
075402aeb280 redis "docker-entrypoint..." 22 minutes ago Up 2 seconds 0.0.0.0:6479->6379/tcp myredis
同时删除所有容器:docker rm -f $(docker ps -a -q) 或者 docker ps -a -q |xargs docker rm
[root@zk01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
04194ab112fd redis "docker-entrypoint..." 6 seconds ago Up 5 seconds 0.0.0.0:6579->6379/tcp myredis2
075402aeb280 redis "docker-entrypoint..." 28 minutes ago Up 5 minutes 0.0.0.0:6479->6379/tcp myredis
[root@zk01 ~]# docker rm -f $(docker ps -a -q)
04194ab112fd
075402aeb280
[root@zk01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@zk01 ~]#
docker logs 查看容器日志
docker logs --tail 100 e48bdf16e51a 查看 容器 e48bdf16e51a 日志后100行
[root@zk01 ~]# docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
--details Show extra details provided to logs
-f, --follow Follow log output
--help Print usage
--since string Show logs since timestamp
--tail string Number of lines to show from the end of the logs (default "all")
-t, --timestamps Show timestamps
[root@zk01 ~]# docker logs --tail 100 e48bdf16e51a
1:C 16 Feb 2019 17:07:07.055 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 16 Feb 2019 17:07:07.055 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 16 Feb 2019 17:07:07.055 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 16 Feb 2019 17:07:07.057 * Running mode=standalone, port=6379.
1:M 16 Feb 2019 17:07:07.058 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 16 Feb 2019 17:07:07.058 # Server initialized
1:M 16 Feb 2019 17:07:07.058 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 16 Feb 2019 17:07:07.058 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1:M 16 Feb 2019 17:07:07.058 * Ready to accept connections
[root@zk01 ~]#
查看容器内进程 docker top e48bdf16e51a
[root@zk01 ~]# docker top e48bdf16e51a
UID PID PPID C STIME TTY TIME CMD
polkitd 50118 50098 0 01:07 ? 00:00:01 redis-server *:6379
docker inspect e48bdf16e51a 查看容器详细信息
[root@zk01 ~]# docker inspect e48bdf16e51a
[
{
"Id": "e48bdf16e51a5e0a5b6ac365a0992c1040b814a38642891cc7450afe25f9086c",
"Created": "2019-02-16T17:07:06.419932504Z",
"Path": "docker-entrypoint.sh",
"Args": [
"redis-server"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 50118,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-02-16T17:07:07.004832447Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
进入正在运行的容器,并以前台方式运行
docker exec -t 容器id bashshell 产品新的进程(/bin/bash) 该命令就是在容器中执行命令。当执行 /bin/bash 时直接开启一个终端和容器交互。否则 直接返回容器中命令执行结果 如 执行 ls /tmp
exec 在容器中打开新的终端,并且可以启动新的进程
docker attach 容器id attach 直接进入容器启动命令的终端,不会启动新的进程
退出容器:
ctrl+Q[+P] 不停止容器退出,退出后容器依然运行 ,还可以通过 docker attach 再次进入交互 (教程中说要加P 自测win环境下不用加P)
exit 退出并停止容器
通过docker 启动一个 centos 容器,然后查看 容器id 并执行 docker attach daadb25b14a0 进入容器,可以执行ls 命令等
docker@default:~$ docker run -itd centos /bin/bash
daadb25b14a03437ef3acdb5791139c13ff3086c18676ee349bce0bfb87d293c
docker@default:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
daadb25b14a0 centos "/bin/bash" 11 seconds ago Up 10 seconds quizzical_murdock
ca2a33a875e0 mysql "docker-entrypoint.s鈥 17 minutes ago Up 8 minutes 3306/tcp, 33060/tcp vigilant_ritchie
docker@default:~$ docker attach daadb25b14a0
[root@daadb25b14a0 /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@daadb25b14a0 /]# ^C
[root@daadb25b14a0 /]# exit
进入mysql 容器方法 docker exec -it ca2a33a875e0
ca2a33a875e0 mysql "docker-entrypoint.s鈥 37 minutes ago Up 27 minutes 3306/tcp, 33060/tcp vigilant_ritchie
docker@default:/$ docker exec -it ca2a33a875e0 /bin/bash
root@ca2a33a875e0:/# ls
bin docker-entrypoint-initdb.d home media proc sbin tmp
boot entrypoint.sh lib mnt root srv usr
dev etc lib64 opt run sys var
root@ca2a33a875e0:/#
exec 还可以直接在容器中执行命令并返回结果,不需要进入容器内部如下,直接执行并返回了ls /tmp 命令的结果
docker@default:~$ docker exec -it 22f39c77003b ls /tmp
ks-script-eC059Y yum.log
从容器 拷贝文件到宿主机 如下 将test.txt 复制到 容器 ,然后再熊容器中复制到宿主机中
docker cp 容器id:容器内路径:宿主机路径
docker@default:~$ docker cp ~/test.txt 22f39c77003b:/opt/test.txt
docker@default:~$ docker attach 22f39c77003b
[root@22f39c77003b opt]# ls
test.txt zxm
docker@default:~$ rm test.txt
docker@default:~$ ls
docker@default:~$ docker cp 22f39c77003b:/opt/test.txt .
docker@default:~$ ls
test.txt
sudo yum install -y yum-utils
添加yum源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo