docker 로그인과 로그아웃을 사설 저장소 기반으로 연동할 수 있다. 


사설 저장소를 입력하지 않으면 index.docker.io 쪽으로 연동되니 주의할 필요가 있다. 



사설 저장소의 도커 로그인은 다음과 같다.

docker login dock.google.io


upload 쉘 스크립트에서 사용할 때는 다음과 같이 사용하면 좋을 것 같다.

docker login dock.google.io
if [ $? -ne 1 ]; then
echo "Please try again."
exit 1
fi


사설 저장소의 도커 로그아웃은 다음과 같다. 

docker logout dock.google.io



안타깝지만, 사설 저장송의 docker 로그인 여부는 확인할 수 없다.


기본 저장소(index.docker.io)일 때만 docker status로 확인할 수 있다. 





참고

https://docs.docker.com/engine/reference/commandline/login/

Posted by 김용환 '김용환'


docker pull 하다가 ctrl+c를 눌러, 중지시켰다.

그리고, docker pull을 실행해도 다음 메시지만 출력하고 더 이상 pull을 하지 못할 수 있다.


.. already being pulled by another client. Waiting.



docker의 불안전한성(?) 때문인 것으로 생각되며, docker daemon을 재시작한다.


$ sudo service docker restart



docker daemon을 재시작한 후, docker pull하면 정상적으로 동작된다. 

Posted by 김용환 '김용환'



지금까지 Dockfile를 만드록 Docker 컨테이너를 테스타했던 경험을 바탕으로 팁을 작성해본다.



1. 항상 Docker image는 최대한 작게 만들어야 한다.


처음 운영체제 Docker 이미지가 작더라도 조금씩 바이너리 또는 응용 프로그램을 설치하면 용량이 꺼진다. 


특히, yum update 또는 필요 없는 툴은 최대한 설치하지 않는다. 생각보다 툴은 용량을 많이 차지한다. 


용량이 꺼지면, 다음의 단점이 있다.

1. 배포를 해야 할 때, 다운로드해야 하기 때문에, 점점 속도가 느려진다.

2.용량이 크면 docker registry push 또는 docker hub push 할 때, 종종 에러가 발생할 수 있다. 계속 retry 해야 한다.. 

(아직 docker registry가 완벽하지 않다.)





2. Dockerfile 를 생성할 때는 설치 단위를 RUN 옵션으로 설정한다. 


Docker image는 history별로 layering이 되어 있다. 더 정확히 말하면, Dockerfile의 RUN 커맨드 하나가 history layer이다.  따라서 커맨드를 &&로 붙여 적당한 추상화를 할 수 있다.


apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*



docker history로 이미지를 보면, 마지막 컬럼이 SIZE이다. 내가 하는 모든 RUN에 대한 용량 체크를 할 수 있다. 



임시 파일/디렉토리 또는 /tmp 또는 wget으로 받은 압축 파일이 존재하는지 확인하고, 용량을 최대한 줄일 수 있도록 해야 한다. 





3. Docker image를 만들다 실패하더라도, 도커 이미지를 지우지 말고 다시 생성을 시도한다.


copy on write 방식이라, 기존에 쓰던 Docker image의 단계별 해시 정보가 있다면 바로 복사해서 쓰기 때문에, 최종 도커 이미지를 생성하기 전까지는 기존의 실패했던 이미지를 최대한 활용하는 방식이 좋다.



하지만, 앞 부분의 RUN 커맨드에서 변경이 일어나면, 뒷 부분까지 모두 해시 정보가 바뀔 수 있기 때문에 Dockerfile 전략을 잘 사용하는 것이 중요하다.


즉, Dockerfile에 새로운 설치를 추가할 때, 맨 마지막에 두어야 한다. 그 부분만 수정한 후, 다시 도커 이미지를 생성할 수 있기 때문에 빠르게 빌드할 수 있다. 





4. 도커 이미지 파일의 용량이 크다는 것은 그만큼 디스크와 CPU를 많이 소비할 수 있는 확률이 생길 수 있다.


Dockerfile을 최적화해도 용량이 늘어난다는 얘기는 계속 사용할 솔루션이 많다는 얘기이다.


8 cpu, 16G 장비에 4 GB가 안되는 도커 이미지를 컨테이너로 사용할 때, 거의 꽉차게 사용될 수 있다. 도커 이미지 특성상 부하가 많을 수 있기 때문에, 늘 테스트를 할 필요가 있다. 도커 컨테이너로 쓰일 장비를 늘 모니터링하고 좋은 장비를 사용하여 성능을 높일 수 있도록 노력해야 한다. 


Posted by 김용환 '김용환'


docker 1.12부터 mac과 윈도우를 지원한다.


https://blog.docker.com/2016/07/docker-for-mac-and-windows-production-ready/


https://blog.docker.com/2016/07/docker-built-in-orchestration-ready-for-production-docker-1-12-goes-ga/



docker 1.12 rc4와 docker 1.12 정식 릴리즈를 쓰고 있는데, 정말 편하게 잘 테스트할 수 있어서 좋다.

Posted by 김용환 '김용환'

[docker 버전 : 1.12]


docker 를 빌드할 때, Dockerfile로 생성하는 단계가 있다. 


docker build -t google-sandbox -f Dockerfile .



docker history 커맨드를 보면, image 안에 여러 image id가 존재하는 것을 볼 수 있다. 즉 RUN 지시자로 정의된 항목마다 하나의 image id가 존재하는 것을 볼 수 있다.


$ docker history 9ee4b3d0f0b5

IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
9ee4b3d0f0b5        3 minutes ago       /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entry   0 B
17e114f16e50        3 minutes ago       /bin/sh -c #(nop)  VOLUME [/data /log]          0 B
18e87f892df1        3 minutes ago       /bin/sh -c #(nop)  ENV TERM=xterm               0 B
df973dbe65e4        3 minutes ago       /bin/sh -c #(nop) COPY file:0939c051875b38702   30 B

ba77ab6a5bd4        8 minutes ago       /bin/sh -c cd /tmp && rm -rf *                  0 B

...




또한 docker push 할 때, image id 단위로 push되는 것을 볼 수 있다.




docker 이미지의 내부 구조를 살펴보면, read-only이면서 순차적인 layer로 구성되어 있다.

특히 docker 1.10부터는 암호화된 hash, 충돌이 나지 않는 hash key로 image id를 구성한다고 한다.




이런 구조의 장점은 기존 이미지의 재활용을 잘 한다는 점이다.

도커를 테스트해보니. 딱 필요한(수정한) 부분만 image id가 생성된다. 따라서 디스크 용량 이슈가 확실히 적어진다.

그래서 컨테이너도 효율적으로 관리할 수 있다. 





또한, 컨테이너를 실행할 때는 분리된 프로세스로 실행되기 때문에 문제 없이 잘 실행된다. 





참고 

* docker의 내부구조에 대한 설명 :
https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/





Posted by 김용환 '김용환'



http://developers.redhat.com/blog/2016/02/24/10-things-to-avoid-in-docker-containers/



레드햇 개발자 블로그에 좋은 내용이 좀 있다.




10 things to avoid in docker containers 라는 블로그을 잠깐 소개한다.


도커의 장점

1. Containers are immutable 

2. Containers are lightweight

3. Containers are fast


피해야 10가지 내용- Don't

1. Don’t store data in containers 
컨테이너는 언제든지 바뀌질 수 있고 사라질 수 있고 멈춰질 수 있다.  데이터 손실에 대한 영향도를 살펴야 한다.

2. Don’t ship your application in two pieces 
애플리케이션을 2로 나누지 말라. 개발 단계(디버그)에서는 상관없지만, 상용 배포에서는 하나로 만든다.

3. Don’t create large images 
큰 이미지는 배포하기 어렵다. 불필요한 패키지는 설치하지 않는다.

4. Don’t use a single layer image
관리를 편하게 하라

5. Don’t create images from running containers 
이미지를 생성하는 docker commit 커맨드를 사용하지 않는다.

6. Don’t use only the “latest” tag 
latest는 maven의 snapshot을 의미한다. 하위 호환성을 조심해야 한다.

7. Don’t run more than one process in a single container 
하나의 컨테이너에 하나 이상의 프로세스를 실행하지 않는다.

8. Don’t store credentials in the image. Use environment variables 
이미지에 중요 크레덴셜(username/password)를 저장하지 않는다.

9. Don’t run processes as a root user 
보안 문제가 언제든지 발생할 수 있다.

10. Don’t rely on IP addresses 
IP는 언제든지 변할 수 있다.





Posted by 김용환 '김용환'


docker 1.12를 사용 중이다.

Docker version 1.12.0-rc4, build e4a0dbc, experimental



mac의 디렉토리를 docker의 리눅스 디렉토리로 복사할 때, 에러가 발생할 수 있다.


docker: Error response from daemon: Mounts denied:

are not shared from OS X and do not belong to the system.

You can configure shared paths from Docker -> Preferences...



이런 에러를 처리하는 방법을 소개한다.



맥에서 docker container로 복사할 때, 정해진 디렉토리만 복사할 수 있다.

/Users, /Volumes, /private, /tmp 이다. 





만약, 기본 디렉토리 외에 다른 디렉토리를 docker container로 복사하려고 할 때가 문제가 될 수 있다.



예) 실행 커맨드

docker run \
-v /mydev/google-sandbox/volume/data:/data \
-v /mydev/google-sandbox/volume/log:/log \
..


에러가 아래처럼 발생했다.



docker: Error response from daemon: Mounts denied:

RROR

The paths /mydev/google-sandbox/data and /mydev/google-spec/docker/google-sandbox/0/log

are not shared from OS X and do not belong to the system.

You can configure shared paths from Docker -> Preferences...

..



Docker 설정에 File sharing 디렉토리를 추가하면, 에러는 발생하지 않는다. 






Posted by 김용환 '김용환'

환경 : docker 1.12, host mac 


맥에서 docker container를 테스트할 수 있는 환경과 linux에서 동작하는 docker를 개발하고 있다.




docke의 /data/start.sh는 주로 데몬으로 사용하는데, 만약 이미지를 만드는 도중에 디버깅을 해야 하거나, push하기 전에 container로 띄워서 불필요한 내용을 정리해야 할 상황이 생길 수 있다. 그 때를 위한 예제이다.




먼저 centos를 기반으로 하고, 여러 애플리케이션이 들어가 있는 도커 이미지를 만들었다. 


$ docker build -t google-sandbox -f Dockerfile .



/data/start.sh 파일이 docker에 존재하지 않으면, docker run 커맨드로 실행을 시킬려면 에러가 발생한다.



$ docker run -i -t --name test google-sandbox /bin/bash

sh: /data/start.sh: No such file or directory




Dockerfile에 이렇게 추가해도. 실행이 되지 않는다. 즉 dummy script는 안된다.


RUN mkdir -p /data && touch /data/start.sh



그래서 docker 이미지에 /data/start.sh에 먼가 길게 동작하는 스크립트로 만든다.


RUN mkdir -p /data && echo $'#/bin/bash\n\
while true; do echo hello world; sleep 10000; done\n\
'\
> /data/start.sh


그리고, docker를 실행한다. 



(가장 중요한 부분은 -d 이다!!)

$  docker run --name test -d google-sandbox /bin/bash -c "echo 1"

ae5f0d3ec968f55c0893d68a23d9033f62471555aa0b65785af946cf86eeec44


$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

ae5f0d3ec968        google-sandbox       "/docker-entrypoint.s"   3 seconds ago       Up 2 seconds                            test



$ docker exec -i -t test /bin/bash

(docker 서버로 진입)

[root@ae5f0d3ec968 /]# ls -al

total 96

....


쉘을 종료했다가 나갔다가도 다시 들어올 수 있다.

$  docker exec -i -t google-sandbox1 /bin/bash
[root@ ae5f0d3ec968 /]#


로그를 보면 /data/start.sh가 실행하고 있음을 확인할 수 있다.


$ docker logs 컨테이너ID

hello world




참고로, 데몬(-d)를 주지 않으면 /data/start.sh의 실행 모드 이동되니. 쓰지 않도록 한다.


$ docker run -i -t --name google-sandbox google-sandbox /bin/bash

hello world

(대기)






참고 자료

https://docs.docker.com/engine/tutorials/dockerizing/

https://docs.docker.com/engine/reference/run/

https://docs.docker.com/v1.10/engine/quickstart/





참고로 테스트하면서 자주 만드는 명령어 추가.


* 사용하지 않는 docker 컨테이너 삭제하기


docker rm `docker ps -a -q`


Posted by 김용환 '김용환'




$ mkdir centos7-expressjs

$ cd centos7-expressjs

$ vi Dockerfile

FROM centos:centos7

RUN yum install -y epel-release;yum install -y npm;

RUN npm install express --save

COPY . ./src

EXPOSE 8080

CMD ["node", "/src/index.js"]


$ vi index.js

var express = require('express'), app = express();

app.get('/', function (req, res) {res.send('Hello World!\n');});

app.listen(8080);


$ docker build -t knight76/centos7-expressjs .

$ docker run -p 8081:8080 -d  knight76/centos7-expressjs

$ curl -i localhost:8081

 

HTTP/1.1 200 OK

X-Powered-By: Express

Content-Type: text/html; charset=utf-8

Content-Length: 13

ETag: W/"d-jd2L5LF5pSmvpfL/rkuYWA"

Date: Tue, 26 Jul 2016 09:43:28 GMT

Connection: keep-alive


Hello World! 



----------------------


도커 허브에 업로드 한다.


우선 https://hub.docker.com에 이메일 계정으로 가입한다.



$ docker login

Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.

Username: 

Password:

Login Succeeded

  


$ docker push knight76/centos7-expressjs

(한국이라 그런지, push 시간이 오래 걸린다.)




$ docker search expressjs

NAME                                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

dmportella/expressjs                      Simple expressjs site with a status route ...   0

....

knight76/expressjs ...

Posted by 김용환 '김용환'

docker를 이용해서 wordpress 테스트 환경을 구축할 수 있다.

wordpress 도커는 mysql을 함께 실행하지 않기 때문에 mysql은 도커 컨테이너를 따로 실행한다.




mysql 5.7 도커 컨테이너를 실행하고 제대로 동작하는지 docker ps로 확인한다.


$ docker run --restart=always --name wordpressdb -e MYSQL_ROOT_PASSWORD=123 -e MYSQL_DATABASE=wordpress -d mysql:5.7


$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES

a54634841ccd        mysql:5.7           "docker-entrypoint.sh"   2 minutes ago       Up 2 minutes        3306/tcp            wordpressdb




wordpress 도커 컨테이너를 실행한다. -p 매개변수는 8080 으로 요청하면 컨테이너에서는 80으로 forwarding 한다.


$ docker run --restart=always -e WORDPRESS_DB_PASSWORD=123 -d --name wordpress --link wordpressdb:mysql -p 8080:80 wordpress




이제 2 개의 도커 컨테이너가 실행 중이다.


$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

76d768dbe13c        wordpress           "/entrypoint.sh apach"   17 minutes ago      Up 17 minutes       0.0.0.0:8080->80/tcp   wordpress

a54634841ccd        mysql:5.7           "docker-entrypoint.sh"   23 minutes ago      Up 23 minutes       3306/tcp               wordpressdb




wordpress 도커 컨테이너 설정을 모두 얻는다. 대략적인 정보를 확인할 수 있다.


$ docker inspect wordpress

[

    {

        "Id": "76d768dbe13cd17c0701c12943170e33de12f9f9853191352f34e7fb5f0b7111",

        "Created": "2016-07-24T13:41:50.569702368Z",

        "Path": "/entrypoint.sh",

        "Args": [

            "apache2-foreground"

        ],

        "State": {

            "Status": "running",

            "Running": true,

            "Paused": false,

            "Restarting": false,

            "OOMKilled": false,

            "Dead": false,

            "Pid": 2655,

            "ExitCode": 0,

            "Error": "",

            "StartedAt": "2016-07-24T13:41:51.086400125Z",

            "FinishedAt": "0001-01-01T00:00:00Z"

        },

        "Image": "sha256:ba0d4f420656196a96f3106b8e22b4e2c00351e48b5218456a8e4833051cc816",

        "ResolvConfPath": "/var/lib/docker/containers/76d768dbe13cd17c0701c12943170e33de12f9f9853191352f34e7fb5f0b7111/resolv.conf",

        "HostnamePath": "/var/lib/docker/containers/76d768dbe13cd17c0701c12943170e33de12f9f9853191352f34e7fb5f0b7111/hostname",

        "HostsPath": "/var/lib/docker/containers/76d768dbe13cd17c0701c12943170e33de12f9f9853191352f34e7fb5f0b7111/hosts",

        "LogPath": "/var/lib/docker/containers/76d768dbe13cd17c0701c12943170e33de12f9f9853191352f34e7fb5f0b7111/76d768dbe13cd17c0701c12943170e33de12f9f9853191352f34e7fb5f0b7111-json.log",

        "Name": "/wordpress",

        "RestartCount": 0,

        "Driver": "aufs",

        "MountLabel": "",

        "ProcessLabel": "",

        "AppArmorProfile": "",

        "ExecIDs": null,

        "HostConfig": {

            "Binds": null,

            "ContainerIDFile": "",

            "LogConfig": {

                "Type": "json-file",

                "Config": {}

            },

            "NetworkMode": "default",

            "PortBindings": {

                "80/tcp": [

                    {

                        "HostIp": "",

                        "HostPort": "8080"

                    }

                ]

            },

            "RestartPolicy": {

                "Name": "always",

                "MaximumRetryCount": 0

            },

            "AutoRemove": false,

            "VolumeDriver": "",

            "VolumesFrom": null,

            "CapAdd": null,

            "CapDrop": null,

            "Dns": [],

            "DnsOptions": [],

            "DnsSearch": [],

            "ExtraHosts": null,

            "GroupAdd": null,

            "IpcMode": "",

            "Cgroup": "",

            "Links": [

                "/wordpressdb:/wordpress/mysql"

            ],

            "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,

            "CgroupParent": "",

            "BlkioWeight": 0,

            "BlkioWeightDevice": null,

            "BlkioDeviceReadBps": null,

            "BlkioDeviceWriteBps": null,

            "BlkioDeviceReadIOps": null,

            "BlkioDeviceWriteIOps": null,

            "CpuPeriod": 0,

            "CpuQuota": 0,

            "CpusetCpus": "",

            "CpusetMems": "",

            "Devices": [],

            "DiskQuota": 0,

            "KernelMemory": 0,

            "MemoryReservation": 0,

            "MemorySwap": 0,

            "MemorySwappiness": -1,

            "OomKillDisable": false,

            "PidsLimit": 0,

            "Ulimits": null,

            "CpuCount": 0,

            "CpuPercent": 0,

            "IOMaximumIOps": 0,

            "IOMaximumBandwidth": 0

        },

        "GraphDriver": {

            "Name": "aufs",

            "Data": null

        },

        "Mounts": [

            {

                "Name": "e0b6d751c7432e4be06a0c0173a70071f0730a42acc3a751a22d45f489011c13",

                "Source": "/var/lib/docker/volumes/e0b6d751c7432e4be06a0c0173a70071f0730a42acc3a751a22d45f489011c13/_data",

                "Destination": "/var/www/html",

                "Driver": "local",

                "Mode": "",

                "RW": true,

                "Propagation": ""

            }

        ],

        "Config": {

            "Hostname": "76d768dbe13c",

            "Domainname": "",

            "User": "",

            "AttachStdin": false,

            "AttachStdout": false,

            "AttachStderr": false,

            "ExposedPorts": {

                "80/tcp": {}

            },

            "Tty": false,

            "OpenStdin": false,

            "StdinOnce": false,

            "Env": [

                "WORDPRESS_DB_PASSWORD=123",

                "no_proxy=*.local, 169.254/16",

                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",

                "PHPIZE_DEPS=autoconf \t\tfile \t\tg++ \t\tgcc \t\tlibc-dev \t\tmake \t\tpkg-config \t\tre2c",

                "PHP_INI_DIR=/usr/local/etc/php",

                "APACHE_CONFDIR=/etc/apache2",

                "APACHE_ENVVARS=/etc/apache2/envvars",

                "PHP_EXTRA_BUILD_DEPS=apache2-dev",

                "PHP_EXTRA_CONFIGURE_ARGS=--with-apxs2",

                "GPG_KEYS=0BD78B5F97500D450838F95DFE857D9A90D90EC1 6E4F6AB321FDC07F2C332E3AC2BF0BC433CFC8B3",

                "PHP_VERSION=5.6.23",

                "PHP_FILENAME=php-5.6.23.tar.xz",

                "PHP_SHA256=39141e9a617af172aedbbacee7a63eb15502850f7cea20d759a9cffa7cfb0a1a",

                "WORDPRESS_VERSION=4.5.3",

                "WORDPRESS_SHA1=835b68748dae5a9d31c059313cd0150f03a49269"

            ],

            "Cmd": [

                "apache2-foreground"

            ],

            "Image": "wordpress",

            "Volumes": {

                "/var/www/html": {}

            },

            "WorkingDir": "/var/www/html",

            "Entrypoint": [

                "/entrypoint.sh"

            ],

            "OnBuild": null,

            "Labels": {}

        },

        "NetworkSettings": {

            "Bridge": "",

            "SandboxID": "ef789188d36c51bce68235e3dc7385a7f0b6c1f64579f225927f5b8e5a690a51",

            "HairpinMode": false,

            "LinkLocalIPv6Address": "",

            "LinkLocalIPv6PrefixLen": 0,

            "Ports": {

                "80/tcp": [

                    {

                        "HostIp": "0.0.0.0",

                        "HostPort": "8080"

                    }

                ]

            },

            "SandboxKey": "/var/run/docker/netns/ef789188d36c",

            "SecondaryIPAddresses": null,

            "SecondaryIPv6Addresses": null,

            "EndpointID": "c24808d9ef0f20266cd0c16337de7b2d88939853afdc5893a2d1898741f0e292",

            "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": "1a45bc6e96c0909fea2d34bc6b1492adc2839f9d5f893ca013af9300aad4fc33",

                    "EndpointID": "c24808d9ef0f20266cd0c16337de7b2d88939853afdc5893a2d1898741f0e292",

                    "Gateway": "172.17.0.1",

                    "IPAddress": "172.17.0.3",

                    "IPPrefixLen": 16,

                    "IPv6Gateway": "",

                    "GlobalIPv6Address": "",

                    "GlobalIPv6PrefixLen": 0,

                    "MacAddress": "02:42:ac:11:00:03"

                }

            }

        }

    }

]




컨테이너 로그를 확인한다.


$ docker logs -f wordpress

WordPress not found in /var/www/html - copying now...

Complete! WordPress has been successfully copied to /var/www/html

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message

[Sun Jul 24 13:41:52.317876 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.23 configured -- resuming normal operations

[Sun Jul 24 13:41:52.317926 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'





웹 브라우져에서 다음을 실행하면 wordpress 설치화면이 나타난다.



http://localhost:8080 또는


http://localhost:8080/wp-admin/install.php






그리고 $ docker logs -f wordpress 결과에 아파치 로그가 출력된다.


172.17.0.1 - - [24/Jul/2016:14:01:44 +0000] "GET / HTTP/1.1" 302 397 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

172.17.0.1 - - [24/Jul/2016:14:01:44 +0000] "GET /wp-admin/install.php HTTP/1.1" 200 3433 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

....



참고로 docker ps는 현재 실행 중인 도커 컨테이너를 출력하고, docker ps -a는 모든 도커 컨테이너를 출력한다. 상태 정보로 확인할 수 있다.


~$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

76d768dbe13c        wordpress           "/entrypoint.sh apach"   21 minutes ago      Up 21 minutes       0.0.0.0:8080->80/tcp   wordpress

a54634841ccd        mysql:5.7           "docker-entrypoint.sh"   27 minutes ago      Up 27 minutes       3306/tcp               wordpressdb



~$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES

76d768dbe13c        wordpress           "/entrypoint.sh apach"   21 minutes ago      Up 21 minutes               0.0.0.0:8080->80/tcp     wordpress

a54634841ccd        mysql:5.7           "docker-entrypoint.sh"   27 minutes ago      Up 27 minutes               3306/tcp                 wordpressdb

5f615fc3de99        hello-world         "bash"                   32 minutes ago      Created                                              furious_wozniak

.....






실행 중인 wordpress와 mysql 도커 컨네이너를 모두 stop 시킨다.


$ docker stop 76d768dbe13c

76d768dbe13c

$ docker stop a54634841ccd

a54634841ccd




실행 중인 애플리케이션 목록은 모두 사라진다.


$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES




도커 컨테이너를 실행할 수 있도록 start를 실행한다.


$ docker start a54634841ccd

a54634841ccd

$ docker start 76d768dbe13c

76d768dbe13c




wordpress 도커 컨테이너에 bash 접근을 하려면 docker exec -it 컨테이너ID /bin/bash 또는 docker exec -it 컨테이너ID bash를 실행한다.


$ docker exec -it 76d768dbe13c /bin/bash

root@76d768dbe13c:/var/www/html# hostname

76d768dbe13c

root@76d768dbe13c:/var/www/html# ps -ef | grep apache

root         1     0 24 14:06 ?        00:00:26 apache2 -DFOREGROUND

www-data    54     1  0 14:06 ?        00:00:00 apache2 -DFOREGROUND

www-data    55     1  0 14:06 ?        00:00:00 apache2 -DFOREGROUND

www-data    56     1  0 14:06 ?        00:00:00 apache2 -DFOREGROUND

www-data    57     1  0 14:06 ?        00:00:00 apache2 -DFOREGROUND

www-data    58     1  0 14:06 ?        00:00:00 apache2 -DFOREGROUND

www-data    60     1  0 14:07 ?        00:00:00 apache2 -DFOREGROUND

root        68    61  0 14:08 ?        00:00:00 grep apache

root@76d768dbe13c:/var/www/html# exit

~$




mysql 도커 컨테이너에서도 bash 접근을 할 수 있다.


~$ docker exec -it  a54634841ccd /bin/bash

root@a54634841ccd:/# ps -ef | grep mysql

mysql        1     0  0 14:06 ?        00:00:00 mysqld

root        56    50  0 14:17 ?        00:00:00 grep mysql

root@a54634841ccd:/# ls -al



Posted by 김용환 '김용환'