CentOS 메일서버 설정 및 자바에서 메일 발송하기


1. CentOS 메일서버 설정

1.1. sendmail 관련 패키지 설치

sendmail, sendmail-cf, sendmail-devel 패키지를 설치한다.

표준 패키지

sendmail - 메일 전송 에이전트

추가 패키지

sendmail-cf - sendmail을 재설정 하는데 필요한 파일들 sendmail-devel

설치

yum install sendmail sendmail-cf sendmail-devel

1.2. sendmail 설정

sendmail은 로컬에서만 메일을 발송하도록 하는데, 릴레이 설정을 하고, 메일 클라이언트를 통해서 발송할 수 있도록 아래와 같이 설정을 바꾼다.

/etc/mail/sendmail.mc

52: TRUST_AUTH_MECH('EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN') dnl
53: define('confAUTH_MECHANISMS', 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN') dnl
116: dnl DAEMON_OPTIONS('Port=smtp,Name=MTA') dnl

위 파일을 통해 sendmail.cf 파일을 생성한다.

m4 sendmail.mc > sendmail.cf

1.3. sendmail 서비스 시작

service start sendmail
chkconfig --level 2345 sendmail on

아래 설정은 부팅 시 실행되도록 설정하는 것이다.

1.4. sendmail access 수정

access권한을 수정한다.

/etc/mail/access

.
.
.
Connect:192.168.0         RELAY

서비스를 재시작 한다.

service sendmail restart

2. 자바 설정

2.1. dependency

<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</articactId>
  <version>version</version>
</dependency>

(spring 기준)

// 환경정보 설정
// 메일서버 주소를 IP 또는 도메인 명으로 지정
Properties props = System.getProperties();
props.setProperty("mail.smtp.host", "127.0.0.1");
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setJavaMailProperties(props);

try {
  final MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  boolean html = false;
  MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, Charsets.UTF_8.displayName());
  helper.setFrom(new InternetAddress("dev.nuti0102@gmail.com", "HyeonilJeong"));
  helper.setTo("nuti0102@gmail.com");
  helper.setSubject("Subject");

  if (MailContentType.HTML.equals(MailContentType.HTML)) {
    html = true;
  }

  helper.setText("Mail Content", html);

  List<String> attachList = new ArrayList<>();
  attachList.add("Attach File Path1");
  attachList.add("Attach File Path2");

  for (final String attach : attachList) {
    final File file = new File(attach);

    if (file.exists()) {
      helper.addAttachment(file.getName(), file);
    }
  }

  javaMailSender.send(mimeMessage);
} catch (Exception e) {
  e.printStackTrace(System.err);
}

docker iptables 오류


iptables failed: ~~~ ! -i docker0: iptables: No chain/target/match by that name

위와 같은 오류가 날 경우 아래와 같이 iptables에 DOCKER 체인을 등록해 주면 된다.

iptables -t nat -N DOCKER
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL ! --dst 127.0.0.0/8 -j DOCKER

Docker Container


1. Docker Container Lifecycle

이미지가 생성되면 이미지를 바탕으로 컨테이너를 생성할 수 있다. 컨테이너의 Lifecycle은 아래와 같다.

Docker Container Lifecycle

1.1. 컨테이너 생성(docker create)

Docker 이미지로 컨테이너를 생성한다. docker create 명령어를 실행하면 이미지에 포함된 linux 디렉토리 및 파일 집합의 스냅샷을 만든다.

1.2. 컨테이너 생성 및 구동(docker run)

Docker 이미지에서 컨테이너를 생성하여 컨테이너상에서 프로로세스를 구동한다.

1.2.1. 생성 및 구동

옵션설명

-a, –attach=[STDIN or STDOUT or STDERR]

표준입력(STDIN), 표준출력(STDOUT), 표준 에러 출력(STDERR)을 연결

–cidfile="file name"

컨테이너 ID를 파일로 출력

-d, –detach=false

컨테이너를 생성하여 백그라운드에서 실행

-i, –interactive=false

컨테이너 표준 입력 열기

-t, –tty=false

tty(단말 디바이스)를 사용

–name

컨테이너 명

docker run -it --name "testCal" centos /bin/cal

test calendar

docker run -it --name "testBash" centos /bin/bash

test bash

1.2.2. 백그라운드 실행

docker run [option] <image>[:tag] [cmd]
옵션설명

-d,–detach

백그라운드에서 실행

-u,–user="사용자명"

사용자명을 입력

–restart=[no or on-failure or on-failure:횟수n or always]

커맨드 실행 결과에 따라 재기동

–rm

커맨드 실행 완료 후 컨테이너 자동 삭제

docker run -d centos /bin/ping localhost

docker run background

실행이 완료된 후 컨테이너를 자동으로 삭제하고자 할 때에는 rm옵션을 사용한다. 또한, 커맨드 실행 결과에 따라 컨테이너를 재구동시키고자 할때에는 restart 옵션을 사용한다.

restart옵션은 아래와 같다.

설명

no

재구동하지 않음

on-failure

종료 status가 0이 아닌 경우 재구동

on-failure:횟수n

종료 status가 0이 아닌 경우 n번 재구동

always

항상 재구동

1.2.3. 컨테이너 네트워크 설정

docker run [option] <image>[:tag] [cmd]
옵션설명

–add-host=[Host Name:IP Address]

컨테이너의 /etc/hosts에 Host Name과 IP Address를 설정

–dns=[IP Address]

DNS 서버의 IP Address를 설정

–expose=[Port Number]

Port Number 할당

–mac-address=[MAC Address]

Container의 MAC Address 설정

–net=[bridge or none or container:'name or d' or host]

컨테이너 네트워크 설정

-h, –hostname=[Host Name]

컨테이너의 Host Name 설정

-P, –publish-all=[true or false]

임의의 포트를 컨테이너에 할당

-p [Host Port Number]:[Container Port Number]

Host와 Container의 Port를 매핑

–link=[컨테이너명:alias]

다른 컨테이너에서 액세스 시 이름 설정

Port Mapping

docker run -d -p 9000:80 httpd

호스트 포트 9000과 컨테이너 포트80에 매핑한다. 호스트 9000으로 액세스 하면 컨테이너 상의 80포트로 연결된다. 임의의 포트를 할당할 때에는 P 옵션을 사용한다.

DNS Server

docker run --dns=192.168.1.1 httpd

MAC Address

docker run -it --mac-address="92:d0:c6:0a:29:33" centos

Host Name

docker run -it --add-host=test.com:192.168.1.1 centos

net option

설명

bridge

bridge 접속(default) 사용

none

네트워크에 접속하지 않음

container:[name or id]

다른 컨테이너의 네트워크를 사용

host

컨테이너가 호스트 OS의 네트워크를 사용

1.2.4. 리소스 설정

docker run [option] <image>[:tag] [cmd]

option

optiondescription

-c,–cpu-shares=0

CPU resource 분배

-m,–memory=[usage]

메모리 사용량 제한(단위는 b, k, m, g)

-v,–volume=[host directory]:[container directory]

호스트와 컨테이너의 디렉토리 공유

cpu & memory

docker run --cpu-shares=512 --memory=512m centos

Docker 리소스를 제한하는 기능은 linuxcgroups 기능을 사용한다.

Host OSContainer내의 디렉토리를 공유하고자 할 때는 volume option을 사용한다.

volume

docker run -v /c/Users/user/workspace:/var/www/html httpd

1.2.5. 환경 설정

docker run [option] <image>[:tag] [cmd]
optiondescription

-e, –env=[환경변수]

환경변수 설정

–env-file=[파일명]

파일에서 환경변수 설정

–privileged=[true or false]

privileged 모드에서 구동(호스트의 커널 기능도 사용 가능)

–read-only=[true or false]

컨테이너의 파일 시스템을 read-only로 설정

-w, –workdir=[경로]

컨테이너의 작업 디렉토리를 설정

docker run -it -e foo=bar centos /bin/bash
docker run -it --env-file=env_list centos /bin/bash

1.3. 컨테이너 목록 확인(docker ps)

docker ps [option]

option

optiondescription

-a, –all=false

구동, 중지 상태의 모든 컨테이너를 표시

–before=""

입력한 컨테이너명 또는 ID보다 이전에 구동된 컨테이너를 표시 –since=""

입력한 컨테이너명 또는 ID보다 이후에 구동된 컨테이너를 표시

-l, –latest=false

마지막에 구동된 컨테이너를 표시

-f, –filter '[key]=[value]'

목록에 표시할 컨테이너를 필터링

–format '[key]=[value]'

폭록에 표시할 포맷을 설정

–no-trunc=false

생략된 정보 없이 모두 표시

-q, –quiet=false

컨테이너 ID만 표시

-s, –size=false

result(option key)

itemdescription

CONTAINER ID

컨테이너 ID

IMAGE

컨테이너 기반이 된 이미지

COMMAND

컨테이너에서 실행중인 커맨드

CREATED

컨테이너 생성 후 경과 시간

STATUS

컨테이너 상태(restarting or running or paused or exited)

PORTS

할당된 포트

NAMES

컨테이너 명

format

placeholderdescription

.ID

컨테이너 ID

.Image

컨테이너의 기반이 된 이미지

.Command

실행 커맨드

.CreatedAt

컨테이너가 생성된 시간

.RunningFor

컨테이너 구동 시간

.Ports

할당된 포트

.Status

컨테이너 상태

.Size

컨테이너 디스크 사이즈

.Labels

컨테이너의 모든 라벨

.Label

컨테이너 라벨

docker ps -a --format "table {{.ID}}\t{{.Status}}"

1.4. 컨테이너 구동 확인(docker stats)

docker stats <컨테이너명 또는 ID>

result

itemdescription

CONTAINER

컨테이너명 또는 ID

CPU %

CPU 사용률

MEM USAGE/LIMIT

메모리 사용량/컨테이너에서 사용할 수 있는 메모리 제한

MEM %

메모리 사용률

NET I/O

네트워크 I/O

1.5. 컨테이너 구동(docker start)

중지중인 컨테이너를 구동한다. 컨테이너명 또는 ID를 입력하여 구동한다.

docker start [option] <컨테이너명 또는 ID>

option

optiondescription

-a, –attach=false

표준 출력, 표준 에러를 연결

-i, –interactive=false

컨테이너 표준 입력을 연결

1.6. 컨테이너 중지(docker stop)

구동중인 컨테이너를 중지한다. 컨테이너명 또는 ID를 입력하여 중지한다.

docker stop [option] <컨테이너명 또는 ID>

option

optiondescription

-t, –time=10

컨테이너 중지 시간을 지정(default: 10)

1.7. 컨테이너 재시작(docker restart)

docker restart [option] <컨테이너명 또는 ID>

option

optiondescription

-t, –time=10

컨테이너 재시작 시간을 지정(default: 10)

1.8. 컨테이너 삭제(docker rm)

컨테이너를 삭제한다. 삭제하는 컨테이너는 사용 중지중이어야 한다.

docker rm [option] <컨테이너명 또는 ID>

option

optiondescription

-f, –force=false

구동 중인 컨테이너를 강제 삭제

-v –volume=false

할당된 볼륨을 삭제

1.9. 컨테이너 일시정지 및 재시작(docker pause/docker unpause)

docker pause <컨테이너명 또는 ID>
docker unpause <컨테이너명 또는 ID>

2. Docker Container Usage

2.1. 컨테이너 접속(docker attach)

docker attach <컨테이너명 또는 ID>

Ctrl + P, Ctrl + Q로 종료

2.2. 컨테이너의 프로세스 실행(docker exec)

docker exec [option] <컨테이너명 또는 ID> <cmd> [value]

option

optiondescription

-d, –detach=false

커맨드를 백그라운드에서 실행

-i, –interactive=false

컨테이너 표준 입력 열기

-t, –tty=false

tty(단말디바이스) 사용

2.3. 컨테이너의 프로세스 확인(docker top)

docker top <컨테이너명 또는 ID>

2.4. 컨테이너의 포트 상태 확인(docker port)

docker port <컨테이너명 또는 ID>

2.6. 컨테이너 내에서 파일 복사

docker cp <컨테이너명 또는 ID>:<컨테이너 내의 파일 경로> <호스트 디렉토리 경로>
docker cp <호스트 파일> <컨테이너명 또는 ID>:<컨테이너 내의 파일 경로>

2.7. 컨테이너 내에서 파일 변경 이력 확인(docker diff)

docker diff <컨테이너명 또는 ID>

구분

구분description

A

파일 추가

D

파일 삭제

C

파일 변경

2.8. docker version

Docker의 버전 확인

docker version

2.9. Docker 실행 환경 확인(docker info)

$ docker info
Containers: 6
 Running: 0
 Paused: 0
 Stopped: 6
Images: 7
Server Version: 1.12.3
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 71
 Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: null bridge host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 4.4.27-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.951 GiB
Name: moby
ID: LRQA:PHWE:COK5:5FCF:7KYP:ZWQ2:346W:PP5A:GMHM:N3WP:AKV4:YYRZ
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
 File Descriptors: 16
 Goroutines: 29
 System Time: 2016-12-17T05:47:28.308350112Z
 EventsListeners: 1
No Proxy: *.local, 169.254/16
Registry: https://index.docker.io/v1/
WARNING: No kernel memory limit support
Insecure Registries:
 127.0.0.0/8

3. 컨테이너에서 이미지 생성

3.1. 컨테이너에서 이미지 생성(docker commit)

docker commit [option] <컨테이너명 또는 ID> [image][:tag]

option

optiondescription

-a, –author=""

생성자 -m, –message=""

메시지

-p, –pause=true

3.2. 컨테이너를 tar 파일로 저장(docker export)

docker export <컨테이너명 또는 ID>

3.3. tar 파일에서 이미지 생성(docker import)

docker import <파일 또는 URL> - [image][:tag]

3.4. 이미지 저장(docker save)

docker save [option] <file> [image]

Docker 기본 사용법


1. 기본 사용 Command

1.1. 이미지 다운로드(docker pull)

docker pull [옵션] <이미지명>[:태그명]

Ubuntu Download

docker pull ubuntu

tag를 붙이지 않으면 자동으로 최신 버전을 다운받는다.

docker pull registry.hub.docker.com/ubuntu

위와 같이 url도 지정할 수 있다.

1.2. 이미지 목록 출력(docker images)

docker images [옵션] [repository명]

Docker Images

위와같이 docker images 명령어를 사용해 다운받은 전체 이미지 목록을 출력할 수 있다.

AttributeDescription

REPOSITORY

Docker 이미지 명

TAG

Docker 이미지 태그명

IMAGE ID

Docker 이미지 ID

CREATED

생성일

VIRTUAL SIZE

사이즈

1.3. 이미지 세부 정보 확인(docker inspect)

docker inspect [옵션] <컨테이너 또는 이미지의 이름, ID>

Docker 이미지의 세부정보를 확인할 수 있다.

$ docker inspect ubuntu
[
    {
        "Id": "sha256:4ca3a192ff2a5b7e225e81dc006b6379c10776ed3619757a65608cb72de0a7f6",
        "RepoTags": [
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2016-11-29T20:04:37.391061223Z",
        "Container": "924f68d3d4b6ae0fe9e35ec75d745b12863d8f0eb3f3d054ca4427a789d72d69",
        "ContainerConfig": {
            "Hostname": "6766fe1c072d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:9ab52bdd7c391413c7e0d83b56df4f6a0a6d2f03cb4c609fca1884ab2e63dab4",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "1.12.3",
        "Author": "",
        "Config": {
            "Hostname": "6766fe1c072d",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:9ab52bdd7c391413c7e0d83b56df4f6a0a6d2f03cb4c609fca1884ab2e63dab4",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 128206574,
        "VirtualSize": 128206574,
        "GraphDriver": {
            "Name": "aufs",
            "Data": null
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:d29d52f94ad5aa750bd76d24effaf6aeec487d530e262597763e56065a06ee67",
                "sha256:dfcc17ddae9e5bab2da074f94856a2a1a42b21e402b49815bb4f87b048082ca5",
                "sha256:1c53295311c1505bddc4d07d5992434de18243951059ab5ea7b2daf9cec1488a",
                "sha256:18568efa7ad4beb199f7a9dc211b33fb2b165dcc0966c4c74af3f5ae396f3ec3",
                "sha256:0d45be5b95d86888d2f6beda0fddb089ba61a3ddc514fdb0a4fd022aad19a392"
            ]
        }
    }
]

주요 정보는 다음과 같다.

  • Image ID

  • 생성일

  • Docker version

  • Image creator

  • CPU

1.4. 이미지 태그 설정(docker tag)

docker tag <image>[:tag] <docker hub 사용자명>/<image명>[:tag명]

Docker Hub에 생성된 이미지를 등록한다. 여기서 docker images 커맨드를 통해서 IMAGE ID가 같음을 확인할 수 있는데, 두 개의 이미지가 이름은 다르나 동일 이미지를 사용한다는 것을 확인 할 수 있다.

Docker Tag

docker search [옵션] <검색 키워드>

Docker Hub에 공개된 이미지를 검색할 때 사용되는 커맨드다.

옵션설명

–automated=false

Automated Build만 표시

–no-trunc=false

모든 결과 표시

-s[–stars=0]

특정 개수 이상의 별 수

항목설명

NAME

Docker Image명

DESCRIPTION

Docker Image 설명

STARS

해당 이미지가 받은 별 수

OFFICIAL

공식 이미지 여부

AUTOMATED

Dockerfile을 기반으로 자동 생성된 이미지 여부

Docker Search

1.6. 이미지 삭제(docker rmi)

docker rmi [옵션] <이미지명>

Docker Image를 삭제할 때 사용한다. 여러 이미지를 삭제하고자 할 때는 공백으로 여러 이미지명을 구분하여 입력한다.

옵션설명

-f, –force=false

이미지 강제 삭제

–no-prune=false

태그가 없는 부모 이미지를 삭제하지 않음

Docker RMI

1.7. Docker Hub에 로그인(docker login)

docker login [옵션] [서버명]

Docker Hub에 업로드 할 때 docker login 커맨드를 사용해 Docker Hub에 로그인 한다. 서버명을 입력하지 않으면 Docker Hub에 액세스한다. 다른 repository로 로그인 할 경우에는 해당 서버명을 입력한다.

옵션설명

-u, –username=""

사용자명 -p, –password=""

패스워드 -e, –email=""

이메일 주소

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you dont have a Docker ID, head over to https://hub.docker.com to create one.
Username: 사용자명
Password: 패스워드
Login Succeeded

1.8. 이미지 업로드(docker push)

docker push <이미지명>[:태그명]

Docker Hub에 이미지를 업로드할 때 docker push 커맨드를 사용한다. docker push 커맨드 사용을 위해서는 docker login을 해야한다.

$ docker push nuti0102/ubuntu:1.0
The push refers to a repository [docker.io/nuti0102/ubuntu]
0d45be5b95d8: Mounted from library/ubuntu
18568efa7ad4: Mounted from library/ubuntu
1c53295311c1: Mounted from library/ubuntu
dfcc17ddae9e: Mounted from library/ubuntu
d29d52f94ad5: Mounted from library/ubuntu
1.0: digest: sha256:3b64c309deae7ab0f7dbdd42b6b326261ccd6261da5d88396439353162703fb5 size: 1357

Docker Push

1.9. Docker Hub에서 로그아웃(docker logout)

docker logout [서버명]

Docker Hub에서 로그아웃할 때 docker logout 커맨드를 사용한다.

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

TensorFlow Intro


1. 딥러닝이란?

  • 사람의 학습 능력을 모방하기 위해 다양한 컴퓨터 알고리즘과 방법론을 연구하는 분야

  • 신경망 알고리즘을 주로 사용하는 머신 러닝의 한 분야

  • 인공 신경망이라는 표현이 조금 더 적절할 수 있으나 포괄적인 의미로서 딥 러닝이라고 불림

  • 신경세포의 구조에서 착안하여 고안된 알고리즘을 사용

  • 신경세포의 특징을 바탕으로 1957년 프랭크 로젠블랫(Frank Rosenblatt)이 개발한 퍼셉트론 알고리즘이 딥 러닝과 많은 머신 러닝 알고리즘의 기초가 됨

2. Perceptron

  • 하나의 퍼셉트론은 하나의 신경세포를 인공적으로 모델링한 뉴런(neuron)이라 표현한다.

  • 입력값 X1, X2가 있을 때 각각 가중치 W1, W2를 곱한 후 더한다.

  • X1 x W1 + X2 x W2

  • 만족스로운 결과가 나올 떄 까지 가중치 W1, W2를 조정한다.

3. 신경망 구조

  • 신경세포 하나가 처리하는 정보는 단순하지만, 수천 억에서 1조 개에 달하는 많은 수의 신경세포가 거미줄처럼 얽혀 있어 복잡한 정보를 가공할 수 있다.

  • 신경망은 여러 개의 뉴런이 하나의 계층을 형성하며, 이런 계층을 다시 어러 개 쌓아 올린다.

  • 연결된 뉴런끼리 얼마만큼 정보를 주고받을지의 가중치를 매번 조절하여 신경망에 있는 모든 뉴런간의 연결을 최적화 하는 과정을 학습 또는 훈련이라 한다.

계층description

입력계층

신경망에서 데이터를 입력받는 계층

출력계층

결과값을 만들어내는 계층

은닉계층

입력계층은닉계층 사이에 끼어있는 계층

구조description

심층 신경망(DNN)

입력계층, 출력계층, 은닉계층으로 나누어짐

합성곱 신경망(CNN)

이미지 안의 물체를 인식하거나 이미지의 장면을 글로 요약하는데 많이 사용됨

순환 신경망(RNN)

???

4. References

  1. 조르디 토레스 . 박해선 텐서플로우 첫걸음 . 한빛미디어, pp. 23-31


Pagination