컨테이너는 명령이 지정된 세 지정할 수 있습니다 시작할 때, 컨테이너를 시작하는 고정 표시기 실행 방법.
(1) CMD 명령
(2) 엔트리 포인트 지침
(3)에 고정 표시기 실행에서 명령 줄을 지정
하지만 고정 표시기 실행하지 장기 실행 상태를 우리는 종종 볼 로그, 시운전, 시작으로, 어떤 일을하기 위해 용기에 입력해야 다른 프로세스 등등. 첨부 간부 : 컨테이너를 입력하는 방법은 두 가지가 있습니다.
고정 표시기 부착
첫째, 장기 실행 배경을 유지, 컨테이너를 시작
docker run -d ubuntu /bin/bash -c "while true; do sleep 1; echo i_am_a_container;done
우선, 용기의 ID를 확인
docker ps -a
컨테이너의 컨테이너 ID 번호는 컨테이너 ID 12 자, 또한 짧은 ID로 알려진 전에 사실이다
이미지가 이미지 자료입니다
컨테이너를 시작할 때 컨테이너의 이름 이름, 컨테이너가 명시 적으로 --name 매개 변수에 이름을 지정할 수 있습니다.
도커하여 터미널은 컨테이너 시작 명령에 부착 할 수있다 연결합니다.
docker attach 1e5cc7e3b22b
콘테이너의 개시 명령을 연결하는 짧은 ID를 통해, 초당 에코 인쇄 정보의 출력 후에보고
후 CTL + (P)을 통해 단자 CTL + Q 출구를 연결할 수를
고정 표시기 간부
같은 고정 표시기 간부를 통해 혈관 속으로
docker exec -it 1e5cc7e3b22b bash
설명
1, 대화식 실행 배시 형태로 단말기를 열 - 그것은
사용자가 정상적인 리눅스처럼 같은 명령을 실행할 수 있고, (2) 상기 컨테이너에 의해 시작된 프로세스 표시
3, 용기 출구
다음과 같이 고정 표시기 exec 명령의 형식은 다음과 같습니다
docker exec -it <container> bash |sh
간부 대 연결
다음과 같이 두 가지의 주요 차이점은
1, 직접 컨테이너 터미널 시작 명령에 attch이 새로운 프로세스 시작되지 않습니다
, 간부는 컨테이너에 새 터미널을 열 수 2, 새로운 프로세스를 시작할 수 있습니다
(3) 당신이 터미널에 직접 원하는 경우, 첨부으로보기 시작 명령의 출력은, 다른 간부 인 사용
모범 사례 실행 컨테이너
서비스 클래스 컨테이너 선 및 도구 : 컨테이너를 사용하여 대략 두 가지 범주로 나눌 수 있습니다
데몬으로 이전 실행을, 그리고 등등 웹 서버, 데이터베이스와 같은 서비스를 제공합니다. 용기 이러한 유형의 문제를 해결하려면, 당신은 간부 - 그것은을 통해 컨테이너를 입력 할 수 있습니다, 매우 적절한 방법 후 -d 스테이션에서 시작
, 일반적으로 임시 작업 환경이 우리에게 줄 수있는 제공 후자의 용기 보통 - 그것은 방법을 실행
다용도 도구 컨테이너 기본 이미지, 예를 들어, 비지 박스, 데비안, 우분투 등
다음과 같이 요약 :
(1) 컨테이너 정지 CMD, Entypoint 고정 표시기 실행 명령 라인 지정된 명령 동작시
백그라운드 컨테이너 -d 파라미터 시작 (2)
(3)과 간부 - 그것은 용기 실행을 입력 할
컨테이너 수명주기
stop / start / restart 용기
고정 표시기 정류장 : 컨테이너에서 실행 중지, 컨테이너는 명령에서 처리 고정 표시기 호스트는 실제로 SIGTERM 신호가 처리와 같은 본질적으로, 또한 신속하게 고정 표시기의 kill 명령에 의해 컨테이너를 중지 보낸다
고정 표시기 시작 : 선박을 중지 할 수 있습니다. 제 기동 파라미터 명령에 의해 개시 될 수있을 때, 용기 유지
고정 표시기를 다시 시작 : 다시 용기
/ 일시 중지 해제 容器 일시 정지
고정 표시기 일시 : 일시 정지는 컨테이너 파일 시스템의 스냅 샷을 싸울 필요로 선박을 수 있도록
일시 중지 해제 : 컨테이너는 일시 정지 상태에 dokcer의 일시 중지 해제하여 복구 작업 때까지 CPU 리소스를 차지하지 않습니다
컨테이너 삭제
고정 표시기의 RM : 일정 기간 후 사용 고정 표시기는 여전히 호스트 호스트에서 파일 시스템 리소스를 차지합니다 컨테이너를 종료 한 많은 수의있을 수 있습니다, 당신은 RM은 삭제 고정 표시기를 사용하여
하나 개 이상의 컨테이너를 삭제하려면, 다음 명령을 사용할 수 있습니다
docker rm -v $(docker ps -aq -f status=exited)
상태 머신 용기
수명주기 상태 머신 전체 컨테이너, 다음과 같이 :
자원 제약
컨테이너의 수는 호스트 고정 표시기에서 실행되며, 각 컨테이너는 CPU, 메모리 및 IO 자원을 필요로한다. 고정 표시기 너무 많은 리소스를지고 다른 컨테이너 또는 전체 HOST 자원에 영향을 미칠 인해 컨테이너를 방지하기 위해 유사한 메커니즘을 제공합니다
메모리 제한
물리적 메모리와 스왑 : 운영 시스템과 유사하게, 메모리가 사용될 수있는 용기는 두 부분으로 구성된다. 도커 용기 파라미터의 다음과 같은 두 세트에 사용되는 메모리의 양을 제어하기 위해
(1) -m 또는 --memory : 메모리 사용 제한을 설정
(2) - 메모리 스왑 : 집합 메모리 및 사용이 교환 한계
예 :
도커 RUN - m 200M --memory 스왑 = 300M 우분투
용기를 허용 할 때 가장 적합한 스왑 200M의 메모리 300메가바이트 기본적으로, 상기 두 개의 파라미터들은 및 용기 교환의 사용에 제한이없는, 즉 -l
progrium / 응력 미러를 사용하여 테스트 거울은 스트레스 테스트 용기를 수행하는데 사용될 수있다
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
설명 :
1 - VM1은 : 작업 메모리 스레드 시작
2 - VM-바이트 280M, 각 스레드에 할당 된 메모리의 2백80메가바이트
절차 :
1 메모리를 280M 할당
이 해제 메모리 280M
3 재배포 280M 메모리
4 및 릴리스
5 같은 기간 순환
CPU 제한
默认设置下,所有的容器可以平等的使用hostCPU资源,而且没有限制
docker可以通过-c或者--cpu-shares设置容器使用cpu的权重,如果不指定,默认值1024
与内存限额不同,通过-c设置的cpu share并不是cpu资源的绝对数量,而是一个相对的权重值。某个容器最终能分配的到的CPU资源取决于它的cpu share总和和比例,换句话说通过cpu share可以设置容器使用CPU的优先级
docker run --name "container_A" -c 1024 ubuntu && docker run --name "container_B" -c 512 ubuntu
container_A的cpu share 1024,是containerB的两倍,当两个容器都需要CPU资源时,前者可以得到的cpu是后者的两倍
需要特别注意的是,这种按权重分配CPU的只会发生在CPU资源紧张的情况下。如果containerA处于空闲状态,这时为了充分利用CPU资源,containrB也可以分配到全部可用的cpu
Block IO带宽限制
Block IO是另一种可以限制容器资源,它是指磁盘的读写,docker可以通过设置权重,限制bsp和iops的方式控制容器读写磁盘的带宽。
IO权重
默认情况下,所有的容器能平等的读写磁盘,可以通过设置 --blkio-weight 参数来改变容器的block IO的优先级
--blkio-weight与--cpu-share类似,设置的是相对权重,默认为500
docker run -it --name container_A --blkio-weight 600 ubuntu && docker run --it --name container_B --blkio-weight 300 ubuntu
通过命令行设定,containerA的读写磁盘带宽是containerB的两倍
限制bps和iops
bsp是byte per second ,每秒读写的数据量
iops是ip per second,每秒IO的次数
可以通过以下参数控制容器的bsp和 iops
--device-read-bps,限制读某个设备的 bps。
--device-write-bps,限制写某个设备的 bps。
--device-read-iops,限制读某个设备的 iops。
--device-write-iops,限制写某个设备的 iops。
cgroup和namespace
cgropu和namespace是实现容器底层的最重要的两种技术。cgroup实现资源限制,namespace实现资源的隔离
cgroup
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。前面我们看到的--cpu-shares、-m、--device-write-bps 实际上就是在配置 cgroup。
可以在/sys/fs/cgroup中找到
docker run -it --cpu-shares 512 progrium/stress -c 1
记录容器ID。在 /sys/fs/cgrouXXXpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:
目录中包含所有与 cpu 相关的 cgroup 配置,文件 cpu.shares 保存的就是 --cpu-shares 的配置,值为 512。
同样的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是内存以及 Block IO 的 cgroup 配置
namespace
在每个容器中,我们都可以看到文件系统,网卡等资源,这些资源看上去是容器自己的。拿网卡来说,每个容器都会认为自己有一块独立的网卡,即使 host 上只有一块物理网卡。这种方式非常好,它使得容器更像一个独立的计算机。
Linux 实现这种方式的技术是 namespace。namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。
Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、I*、PID、Network 和 User。
Mount namespace
Mount namespace 让容器看上去拥有整个文件系统。
容器有自己的 / 目录,可以执行 mount 和 umount 命令。当然我们知道这些操作只在当前容器中生效,不会影响到 host 和其他容器。
UTS namespace
简单的说,UTS namespace 让容器有自己的 hostname。 默认情况下,容器的 hostname 是它的短ID,可以通过 -h 或 --hostname 参数设置。
I P C namespace
IPC namespace 让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起。
PID namespace
能够使容器能够拥有自己的PID
Network namespace
Network namespace 让容器拥有自己独立的网卡、IP、路由等资源。我们会在后面网络章节详细讨论。
User namespace
User namespace 让容器能够管理自己的用户,host 不能看到容器中创建的用户。
常用命令
다음과 같은 일반적인 작업을 지휘하고 용기
컨테이너를 만드는 생성
실행 실행 컨테이너
일시 정지 일시 정지 컨테이너를
일시 중지 해제 일시 중지가 해제 컨테이너 계속 실행
컨테이너 중지 SIGTERM을 전송 중지를
신속하게 용기가 중지 SIGKILL 보내기 죽일를
탱크 시작하기 시작
컨테이너가 다시 시작 다시 시작
터미널의 과정을 시작하는 컨테이너에 부착 부착
용기에 간부를 보통 "- 그것은"파라미터 새로운 프로세스를 시작
로그가 "-f"연속 인쇄와, 컨테이너의 프로세스를 시작합니다 콘솔 출력을 보여
디스크 컨테이너에서 삭제 RM